双向链表
前面讲过线性表中[顺序表和链表].但双向链表无论在考察还是运用中都占有很大的比例,笔者旨在通过本文与读者一起学习分享双链表相关知识。
双链表介绍
与单链表区别
逻辑上没有区别。他们均是完成线性表的内容。主要的区别是结构上的构造有所区别。
对于单链表:对于一个节点,有储存数据的data。和next后驱节点(指针)。也就是这个单链表想要一些遍历的操作都得通过前节点—>后节点。
对于双链表:对于一个节点,有些和单链表一样有存储数据的data,指向后方的next(指针)。它拥有单链表的所有操作和内容。但是他还有一个前驱节点pre(指针)。
结构的设计对于双链表的结构,上图也很清楚的。以前设计的单链表是带头节点的。带头节点可以方面首位的插入和删除。而这次我们抱着学习的态度搞清链表故该双链表是不带头节点的.
同时,以前的单链表是不带尾节点的,这次我们带上尾节点tail。这样我们就接触了几乎所有类型啦!遇到啥也不怕了。
所以我们构造的这个双链表的的性质:不带头节点、带尾指针(tail)、双向链表。
对于node节点:class node {
T data;
node pre;
node next;
public node() {
}
public node(T data) {
this.data = data;
}
}
对于链表:public class doubleList {
private node head;// 头节点
private node tail;// 尾节点
private int length;
//各种方法
}
具体方法的解析其实对于一个链表主要的操作还是增删。增闪的话都需要考虑是否带头节点。头插、尾插、中间插。并且还要考虑其中的一些细节处理。指针的运算。防止链表崩掉。因为这些操作如果不当往往会对链表的结构和证悟性带来致命的打击。而像查找那些逻辑稍微简单。也很容易排查错误。
初始化我们知道一个双链表在最初的时候它的数据肯定是为null的。那么对于这个不带头节点的双链表而言。它的head始终指向第一个真实有效的数据。tail也是如此。那么在最初没数据的时候当然要head=null,并且tail=head。(tail和head需要在一个链上)。public doubleList() {
head = null;
tail = head;
length = 0;
}
增加
空表插入:对于空