linkedList中的双向链表JDK1.8
程序员文章站
2022-07-14 08:34:23
...
综述
linkedList是我们经常使用的集合容器之一,其底层数据结构是一个双向链表。但是这个双向链表与教材中的双向链表有所不同。
接下来我们分析这种双向链表的存储结构。
1.linkedList中双向链表的结构
注意:(1)linkedList中的双向链表没有头指针都是节点;(2)第一个节点的前驱为null,最后一个节点的后驱为null。
下面是大部分教材中的双向链表
2.增
执行过程
第一步:
第二步:
第三步:
第四步:
源码
下面的源码就是LinkedList(JDK1.8)中新增节点的关键部分源码,其执行过程就是上图中的顺序。
//succ就是上图中的succ
void linkBefore(E e, Node<E> succ) {
//pred就是上图中的pred
final Node<E> pred = succ.prev;
//newNode也是
//这一行代码就是上图中的第二步
final Node<E> newNode = new Node<>(pred, e, succ);
//上图中的第三步
succ.prev = newNode;
//判断是否作为第一个节点加入到双向链表中
if (pred == null)
first = newNode;
else
//上图中的第四步
pred.next = newNode;
size++;
modCount++;
}
3.删
执行过程
第一步:
第二步:
第三步:
源码
下面的源码就是LinkedList(JDK1.8)中删除节点的关键部分源码,其执行过程就是上图中的顺序。
//x是要删除的那个节点
E unlink(Node<E> x) {
//element是要删除节点的data部分
final E element = x.item;
//next就是上图中的next
final Node<E> next = x.next;
//prev就是上图中的prev
final Node<E> prev = x.prev;
//判断要删除的节点是否是该双向链表的第一个节点
if (prev == null) {
first = next;
} else {
//这两行代码就是上图中的第二步
prev.next = next;
x.prev = null;
}
//判断要删除的节点是否是最后一个节点
if (next == null) {
last = prev;
} else {
//这两行代码就是上图中的第三步
next.prev = prev;
x.next = null;
}
//要删除节点的data部分也为null
x.item = null;
size--;
modCount++;
return element;
}