在了解双向循环链表以前,若是对链表尚未一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容。(废话有点多[逃]html
相比单链表,双向循环链表是一个更加复杂的结构。由于双向循环链表的节点不只包含指向下一个节点的指针(next),还包含指向前一个节点的指针(prev)。java
双向循环链表的基本操做有:增(add),删(remove),改(set),查(find),插(insert)等。在这里咱们只讲解remove,insert和getNode操做,其余实现可看下方源码。node
因为双向链表有两个可见的节点(head和end),所以双向循环链表获取节点的操做和单链表有所不一样。算法
双链表的设计应用了算法设计的“空间换时间”思想,经过消耗更多的空间来缩小操做的时间复杂度。this
public class Node<Anytype> { public Anytype data;//数据 public Node<Anytype> prev;//前一个节点 public Node<Anytype> next;//后一个节点 public Node(Anytype data,Node<Anytype> prev,Node<Anytype> next){ this.data=data; this.prev=prev; this.next=next; } } ---------------------------------------------- public class DoubleLink<AnyType> { Node<AnyType> head;//头指针 Node<AnyType> end;//尾节点 int size;//记录链表长度 //初始化链表 public void initlist(){ end=new Node<>(null,null,null); head=new Node<>(null,null,end); end.prev=head; end.next=head; size=0; } //获取长度 public int length(){ return size; } //获取节点 public Node<AnyType> getNode(int index){ Node<AnyType> n; if(index>=size/2){ n=end; for(int i=length();i>index;i--){ n=n.prev; } return n; } else{ n=head; for(int i=0;i<=index;i++){ n=n.next; } return n; } } //添加元素 public void add(AnyType a){ Node<AnyType> renode=new Node<>(a,getNode(size-1),end); renode.prev.next=renode; renode.next.prev=renode; size++; } //插入元素 public void insert(int i,AnyType a){ Node<AnyType> n=getNode(i); Node<AnyType> renode=new Node<>(a,n.prev,n); n.prev.next=renode; n.prev=renode; size++; } //删除元素 public AnyType remove(int i){ Node<AnyType> n=getNode(i); AnyType data=n.data; n.prev.next=n.next; n.next.prev=n.prev; size--; return data; } //获取i位置的数据 public AnyType get(int i){ return getNode(i).data; } //为i位置元素从新赋值 public AnyType set(int i,AnyType a){ Node<AnyType> n=getNode(i); AnyType old=n.data; n.data=a; return old; } //清空链表 public void clear(){ initlist(); } public void print(){ for(int i=0;i<size;i++){ System.out.println(getNode(i).data); } } }