LinkedLis的數據結構——雙向鏈表

綜述

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;
	    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章