本文已收錄到 AndroidFamily,技術和職場問題,請關注公眾號 [彭旭銳] 提問。
大家好,我是小彭。
在上一篇文章裡,我們聊到了基於動態陣列 ArrayList 線性表,今天我們來討論一個基於連結串列的線性表 —— LinkedList。
小彭的 Android 交流群 02 群已經建立啦,掃描文末二維條碼進入~
思維導圖:
List
介面。另外 LinkedList 還實現了 Java 的 Deque
介面,是基於連結串列的棧或佇列,與之對應的是 ArrayDeque
基於陣列的棧或佇列;在資料結構上,LinkedList 不僅實現了與 ArrayList 相同的 List 介面,還實現了 Deque 介面(繼承於 Queue 介面)。
Deque 介面表示一個雙端佇列(Double Ended Queue),允許在佇列的首尾兩端操作,所以既能實現佇列行為,也能實現棧行為。
Queue 介面:
拒絕策略 | 拋異常 | 返回特殊值 |
---|---|---|
入隊(隊尾) | add(e) | offer(e) |
出隊(隊頭) | remove() | poll() |
觀察(隊頭) | element() | peek() |
Queue 的 API 可以分為 2 類,區別在於方法的拒絕策略上:
拋異常:
返回特殊值:
Deque 介面:
Java 沒有提供標準的棧介面(很好奇為什麼不提供),而是放在 Deque 介面中:
拒絕策略 | 拋異常 | 等價於 |
---|---|---|
入棧 | push(e) | addFirst(e) |
出棧 | pop() | removeFirst() |
觀察(棧頂) | peek() | peekFirst() |
除了標準的佇列和棧行為,Deque 介面還提供了 12 個在兩端操作的方法:
拒絕策略 | 拋異常 | 返回值 |
---|---|---|
增加 | addFirst(e)/ addLast(e) | offerFirst(e)/ offerLast(e) |
刪除 | removeFirst()/ removeLast() | pollFirst()/ pollLast() |
觀察 | getFirst()/ getLast() | peekFirst()/ peekLast() |
這一節,我們來分析 LinkedList 中主要流程的原始碼。
first
和 last
指標指向連結串列的頭尾指標。LinkedList 的屬性很好理解的,不出意外的話又有小朋友出來舉手提問了: