数据结构基础之双向链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表,如下图所示,同时下图也是LinkedList 底层使用的是双向循环链表数据结构。
现在我们来看下LinkedList的源码,集合类的作用就是存储数据然后取数据。所以我们就看下构造函数,插入,查找。
//构造函数
LinkedList<String> list=new LinkedList<>();
//insert
list.add("a");
list.addFirst("fist");
list.addLast("last");
//search
list.getFirst();
list.get(1);
list.getLast();
1,构造函数
/**
* Constructs an empty list.
*/
public LinkedList() {
}
我们可以看到构造函数里面什么都没有,就是一个空对象。我们看下它的属性,就三个
transient int size = 0;
/**
* Pointer to first node.
* Invariant: (first == null && last == null) ||
* (first.prev == null && first.item != null)
*/
transient Node<E> first;
/**
* Pointer to last node.
* Invariant: (first == null && last == null) ||
* (last.next == null && last.item != null)
*/
transient Node<E> last;
size,没有注释,应该是集合中元素的个数,这个后面验证(事实上是的)。first头节点,last尾节点。我们看到这三个属性都加上了transient关键字。这是为什么呢?这个暂时没找到比较合适的解答,如果你知道的下方评论告诉我吧。
2.add方法
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
//当前节点设置为尾节点
last = newNode;
if (l == null)//第一次插入当前节点就是头节点.
first = newNode;
else//设置当前节点为上一个尾节点的后继元素
l.next = newNode;
size++;
modCount++;
}
我自己这样理解的没有画图,相继插入 a,b,c
插入a
l=null
newnode=a
last=a
first=a
插入b
l=a
newnode=b
last=b
a.next=b
插入c
l=b
newnode=c
last=c
b.next=c
链表结果:
a->b->c
后面的几个方法都很简单,基本一看就会,不写啦。哈哈