LinkedList的底層實現

2021-10-14 13:04:35 字數 1965 閱讀 2383

先看個結構圖

我們知道linkedlist的底層是使用鍊錶實現的,我們來看下原始碼

// 鍊錶的長度

transient

int size =0;

/**鍊錶的頭

* pointer to first node.

* invariant: (first == null && last == null) ||

* (first.prev == null && first.item != null)

*/transient node

first;

/**鍊錶的尾

* pointer to last node.

* invariant: (first == null && last == null) ||

* (last.next == null && last.item != null)

*/transient node

last;

/** * constructs an empty list.

*/public

linkedlist()

我們來看node的**

private

static

class

node

}

我們可以看到,我們鍊錶維護了乙個size、first(頭)和last(尾),我們可以看到node的結構中有個item、next、prev充分說明了此鍊錶是乙個雙向鍊錶。

我們來看下什麼是雙向鍊錶

雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。

我們來看下他的add

// 將指定的元素追加到此列表的末尾。

public

boolean

add(e e)

// 將e鏈結為最後乙個元素。

void

linklast

(e e)

public e remove

(int index)

node

node

(int index)

else

}

我們可以看到,我們想要移除指定位置的節點,首先得找到這個節點(這個是重點),關鍵我們的鍊錶如何找到指定位置?不知道大家有沒有自己比較好的方法,我們來看下jdk的思路(我覺得jdk的實現方法很有趣),node(int index)方法中的if條件拿index和size的一半比較,文字解釋太麻煩了,我來畫個圖吧:

假設:我們linkedlist的長度為6,如要remove的index為3,此時我們3 < (size >> 1)為false,則我們從linkedlist後面開始直到變數i>index,此時i變數位置的就是index位置的node,如果我們index是2,那麼是從前面開始的,我們大家想這樣其實是把linkedlist從中間分為2個,速度是不是比沒分之前快兩倍呢,哈哈哈~

總結:linkedlist為雙鏈表,維護的是乙個first和last指標,而每個節點有item自身、prev和next兩個節點來維護雙鏈表的關係,其他的功能都是圍繞我們的雙鏈表來進行的,有興趣的大家可以仔細研究一下原始碼,有時會發現很有趣的小細節哦~

LinkedList底層原理

首先 linkedlist 是雙向列表。用於記錄集合的數量 transient intsize 0 集合的第一項 transient nodefirst 集合的最後一項 transient nodelast linkedlist類中有乙個內部私有類node,這個類就代表雙端鍊錶的節點node。這個類...

LinkedList 底層分析

如圖所示linkedlist底層是基於雙向鍊錶實現的,也是實現了list介面,所以也擁有 list 的一些特點 jdk1.7 8 之後取消了迴圈,修改為雙向鍊錶 public boolean add e e links e as last element.void linklast e e 可見每次...

手工實現LinkedList

參照其底層 按照自己的理解實現了linkedlist的一些基本功能。如果對c和c 指標了解一下,理解起來非常快。package cn.liu.mylinkedlist 結點 public class node 構造器,來傳資料 public node object element package c...