双向链表也叫双链表,是链表的一种。我们可以给双向链表的每个节点分为三个部分:pre,data,next (如图)。首节点的pre和尾节点的next指向都为空,中间节点 pre用来指向前一个节点的地址,data用来存放数据,next用来指向后一个节点的地址。由此可见,每个链节点有两个指向其它节点的引用。一个指向前驱节点,一个像传统链表一样指向后继节点,这样双向链表不但可以寻找自己下一个节点,也能寻找自己上一个节点,这样就可以实现双向遍历。
LinkedList的底层就是使用了双向链表原理,下面我们通过java代码简单模拟LinkedList的add方法来理解双向链表。
/**
* 节点类
* @author
*
*/
public class Node {
private Object previous;//每个节点的前一个指向
private Object obj;//每个节点中间位置用来存放数据
private Object next;//每个节点的后一个指向
public Object getPrevious() {
return previous;
}
public void setPrevious(Object previous) {
this.previous = previous;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public Object getNext() {
return next;
}
public void setNext(Object next) {
this.next = next;
}
}
/**
* 模拟LinkedList的add方法
* @author
*
*/
public class MyLinkedList {
//对于每一个LinkedList集合 ,都有一个首节点和一个尾节点
private Node first; //首节点
private Node last; //尾节点
public void add(Object obj) {
if(first==null) { //证明我放入的是第一个节点
//创建一个独立的节点
Node n = new Node();
n.setPrevious(null);
n.setObj(obj);
n.setNext(null);
//因为只放入了一个节点,所以这个链表首节点和尾节点都 为n
first = n;
last = n;
}else { //放入的是第n个节点,n>=2
//创建一个独立的节点
Node n = new Node();
n.setPrevious(last); //pre指向上一个节点
n.setObj(obj);
n.setNext(null);
//将上一个节点last的next指向下一个节点,也就是新添加的节点n
last.setNext(n);
//因为新加入一个节点,尾节点就不在是上一个last,新添加的节点n才是尾节点
last=n;
}
}
}