LinkedList(Java8)個人理解

2021-09-03 07:12:44 字數 2388 閱讀 1546

問題:對 linkedlist 的理解?

linkedlist 我將其翻譯為「鍊錶」,其實也並不準確,linkedlist 實現了 list 介面和 deque(雙端佇列) 介面,所以既可以作為鍊錶(常用的方法有 add()、remove()、get())使用,也可以作為佇列(常用的方法有 offer()、poll()、peek())使用(fifo)。並且 linkedlist 內部是雙向鍊錶結構,從鍊錶的任一端都可以遍歷,所以 linkedlist 還可以作為堆疊(常用的方法有 push()、pop())使用。得益於雙鏈表的結構,乙個 linkedlist 有多種資料結構用途,並且對於佇列和堆疊的操作也新增了額外的方法(實際上方法內部呼叫的還是鍊錶的基本方法)。

問題:linkedlist 的 node 怎麼理解?

node 是 linkedlist 的私有靜態內部類,作為鍊錶結構的基本元素,可以看作是鏈條上的乙個節(結)點。乙個 node 物件中除了儲存元素的值外,還儲存著前乙個 node 和後乙個 node 的引用。

問題:linkedlist 內部是怎麼存放資料的?

linkedlist 對資料進行封裝,在內部組裝成 node。linkedlist 由下面幾個部分組成,主體為若干個 node,首尾各乙個 node 的引用,乙個記錄 node 個數的 size。前後的 node 之間互相引用,構成雙向鍊錶。如果鍊錶為空,first 和 last 都指向 null,如果鍊錶中只有乙個 node,first 和 last 都指向這個 node(first 和 last 都是這個 node 的引用)。如果鍊錶有多個 node,first 和 last 分別指向鍊錶首尾的 node。對於每個 node 來說,如果該 node 前還有 node,那麼這個 node 的 prev 指向前乙個 node,否則 prev 指向 null;如果該 node 後還有 node,那麼這個 node 的 next 指向後乙個 node,否則 next 指向 null。

問題:linkedlist 是怎麼進行查詢的?

linkedlist 相比於 arraylist 的優勢在於插入和刪除,劣勢是查詢,linkedlist 類使用雙向鍊錶一定程度上確實可以提高查詢效率。

linedlist 中的查詢分為兩種,一種是根據 index 查詢 node(包含元素值),也即是 node() 方法,另一種是根據 object(元素值) 查詢 index,也即是 indexof() 方法。煉表不像陣列那樣,可以根據 index 直接查詢出元素的值,因為兩者在記憶體種的結構是不一樣的,陣列儲存在連續的記憶體空間,而鍊錶儲存不需要連續的記憶體空間。

鍊錶中的 index 只是標記元素的相對於鍊錶頭部(first 指向的)node 的個數,這樣在根據 index 查詢時,可以根據 index 和 size 的關係,提高查詢效能。當 index 大致在鍊錶的前半部分時(index < (size >> 1)),從鍊錶的首部開始遍歷顯然更快,而當 index 大致在鍊錶的後半部分時(index > (size >> 1)),從鍊錶的尾部開始遍歷顯然更快,這樣就使得查詢次數從 n 次將為了 n/2 次,雖然查詢演算法的時間複雜度還是 o(n)。

根據元素值來查詢 node 的 index,使用的是 indexof() 方法和 lastindexof() 方法,前乙個方法是從前往後查詢,後乙個方法是從後往前查詢。

問題:linkedlist 內部一些方法的區別?

linkedlist 內部有很多功能相同的方法,方法內部大多都是呼叫 link 相關的方法。

linkedlist

新增元素

刪除元素

檢視元素

作為鍊錶

add()、set()

unlink()、remove()

get()

作為佇列

offer()

poll()

peek()

作為棧push()

pop()

問題:linkedlist 和 arraylist 的區別

linkedlist 是基於雙向鍊錶實現的,arraylist 是基於陣列實現的。

linkedlist 新增、插入、刪除元素速度更快,而 arraylist 查詢速度更快。

linkedlist 使用 node 來儲存資料,每個 node 中不僅儲存元素的值,還儲存了前乙個 node 的引用和後乙個 node 的引用,占用記憶體更多,而 arraylist 使用 object 陣列來儲存資料,占用記憶體相比會更少。

linkedlist 和 arraylist 都是執行緒不安全的,可以使用 collections 中的方法在外部封裝一下。

鍊錶的實現 LinkedList (Java實現)

public class linkedlist public node e e public node public string tostring 虛擬的頭結點 private node dummyhead private int size public linkedlist 獲取鍊錶的元素個數 ...

8月8日小結

又經歷一次比賽,今天比賽前兩道題都比較簡單,第一題沒有難度,第二題理解起來有些麻煩,看了好一會才搞懂題意,不過被題意帶進坑了去了,題意就是取區間內的數從小到大重新排列,看要求的位置數字有沒有變化,看懂後便直接用sort寫了,測試沒問題,提交就超時,重新優化了幾個地方,依舊是超時,才感覺出來這是個坑。...

日記8月8日

前言 前幾天一直不知道在忙些什麼,反正就是沒有時間寫.正好今天有時間,將以前的感想也補上.我們4個人是提前兩天過來的,回顧下來到北京的這幾天.8月8日 早上8點鐘,火車準時到達北京首都,這個讓我們走進中科軟體學院就一直魂牽夢繞的地方 早就知道大四要去北京實習 走進北京的第乙個感覺就是涼爽,因為前十幾...