代码不全只是自己记录学习,借鉴:https://blog.csdn.net/javazejian/article/details/52953190;强烈推荐此大神博客。。。
package com.zejian.structures.LinkedList.MyLinked;
import sun.security.pkcs11.Secmod;
/**
* 循环链表的实现类 头结点为空
* @param <T>
*/
public class LoopLinkedList<T> implements ILinkedList<T> {
//不带数据的头结点
private DNode<T> head;
//初始化头结点
public LoopLinkedList() {
//生成一个自关联的空节点
this.head=new DNode<T>();
this.head.next=this.head;
this.head.pre=this.head;
}
@Override
public boolean isEmpty() {
return this.head.next==head;//循环双链表的后继指针指向自己说明是空链表
}
@Override
public int length() {
int length=0;
DNode<T> p=this.head.next;
while (p!=this.head){
length++;
p=p.next;
}
return length;
}
/**
* 获取数据
* @param index
* @return
*/
@Override
public T get(int index) {
DNode<T> head = this.head;
int length = length();
if (index<0){
return null;
}
int j=0;
while (j<index&&head.next!=null){
head=head.next;
j++;
}
return head.data;
}
@Override
public T set(int index, T data) {
return null;
}
/**
* 根据index插入
* 循环链表中无论是prev还是next都不存在空的情况,因此添加时
* 无论是头部还是尾部还是中,都视为一种情况对待
* @param index
* @param data
* @return
*/
@Override
public boolean add(int index, T data) {
//判定异常
int length = length();
if(data==null||index<0||index>=length){
return false;
}
//添加数据
DNode<T> font = this.head;//头结点数据
int j=0;
while (font.next!=null&&j<index){//查找插入点位置
j++;
font=font.next;
}
//创建插入点 指针指向设置 通过构造方法 已有节点——》新节点
DNode<T> p = new DNode<>(data, font, font.next); //插入第一个值是font 和font.next是一个对象
System.out.println(font==font.next);//true
//指针指向设置 新节点——》已有节点
font.next=p;
font.next.pre=p;
return true;
}
/**
* 从尾部插入
* @param data
* @return
*/
@Override
public boolean add(T data) {
int length = length();
int j=0;
DNode<T> font = this.head;
while (j<length){
font=font.next;
j++;
}
//创建数据 设置指针
DNode<T> p = new DNode<>(data, font, this.head);
font.next=p;
this.head.pre=p;
return true;
}
/**
* 删除数据
* @param index
* @return
*/
@Override
public T remove(int index) {
T move=null;
int length = length();
if (index<0||index>=length){//数组越界
return move;
}
DNode<T> font = this.head;
int j=0;
while (j<index&&font.next!=head){
font=font.next;
j++;
}
if (font!=head){//font是第一个数据的话,数据会剩一个自连接的空字符串
font.pre.next=font.next;
font.next.pre=font.pre;
move=font.data;
}
return move;
}
@Override
public boolean removeAll(T data) {
return false;
}
@Override
public void clear() {
}
@Override
public boolean contains(T data) {
return false;
}
public static void main(String[] args) {
LoopLinkedList<String> loop=new LoopLinkedList<>();
loop.add(0,"1");
// loop.add("2");
// loop.add("3");
// loop.add("4");
//
//
// for (int i = 0; i <10 ; i++) {
// System.out.println(loop.get(i));;
// }
//循环链表就实现了
/*null
1
2
3
4
null
1
2
3
4*/
}
}