綜述
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;
}