双向链表提供了向前遍历,也可以向后遍历整个链表,其中的问题关键就在每个链结点有两个指向其他链结点的引用。而不是一个,第一个像普通链表一样指向下一个链结点,第二个指向前一个链结点
,如图:
双向链表的缺点是每次插入或者删除一个链结点的时候,要处理四个链结点的引用,而不是两个;两个链接前一个链结点,两个链接后一个链结点,由于多了两个引用,链结点的占用空间也变得大了一些
插入一个新的链结点,会把原来的链结点指向新的链结点,同时把新的链结点又指向前面的链结点,因为是双向链表,所以用图片更容易说清楚。
删除,删除的话相对来说比较复杂,假设被删除的是current所指的链结点,同时假设删除的不是第一个链结点,也不是最后一个链结点,current.previus(被删链结点的前一个链结点)的next字段指向current.next(被删链结点的后一个链结点),current.next的previous字段指向current.previous,这样就使current指向的链结点和链表断开了链接
current.previous.next = current.next;
current.next.previous = current.previous;
以下是代码 java代码建议对照上面的图形查看
public class DoubleLinkList {
public class DoubleNode {
public long data; //节点数据
public DoubleNode next;//下一个节点
public DoubleNode previous;//上一个节点
public DoubleNode(long value) {
this.data = value;
}
public void display() {
System.out.print(data + " ");
}
}
public DoubleNode first;//头节点
public DoubleNode end;//尾节点
public DoubleLinkList() {
first = null;
end = null;
}
/**
* 判断是否为空
*/
public boolean isEmpty() {
return first == null;
}
/**
* 在头节点插入数据
*/
public void insertFirst