🔗 Linked List
指標操作、快慢指針與虛擬頭節點。
29 題 · 1 篇導讀
📖 分類導讀
鏈結串列是由節點透過指針相連的線性資料結構。不支援隨機存取,但插入和刪除操作為 O(1)。
Notes:
- Dummy head node 可以大幅簡化邊界處理
- 快慢指針是鏈結串列題目的核心技巧
- 修改指針時要小心順序,避免斷鏈
單向 vs 雙向
- 單向 (singly):每個節點只有
next。省空間,但只能往後走,刪除某節點得先拿到它的前驅。 - 雙向 (doubly):節點有
prev與next,常再配一個tail。支援雙向遍歷、O(1)刪除已知節點,是 LRU 快取等設計題的基礎。
WARNING
鏈結串列沒有隨機存取:取第 k 個節點得從 head 走 k 步(O(k)),不像陣列能 O(1) 索引。這也是為什麼很多陣列題的雙指針技巧,在鏈結串列上要改用「快慢指針」實現。
指針操作心法
改指針前先在紙上畫出「改之前」與「改之後」的箭頭,並特別當心:
- 順序:要接的新指針先存好,再斷舊指針,否則節點會遺失。反轉串列的
next = cur.next; cur.next = prev就是這個道理。 - Dummy head:在真正的頭前面加一個哨兵節點,能讓「刪除頭節點」「合併時的起點」等邊界與一般情況統一處理。
- 哨兵 (sentinel) 思維同樣適用於迴圈:在尾端放一個保證匹配的標記,可省去「是否到結尾」的反覆判斷。
fun reverseList(head: ListNode?): ListNode? {
var prev: ListNode? = null
var cur = head
while (cur != null) {
val next = cur.next // 先存好後繼
cur.next = prev // 反轉指向
prev = cur // 整體前移
cur = next
}
return prev
}
本章深入
- 快慢指針 (Fast & Slow Pointers):偵測環、找環入口、找中點、找倒數第 k 個節點。
跨倉庫導讀
- 對應理論章節:線性資料結構