System.Collections.Generic.LinkedList<T> 是 .NET Framework 中唯一的雙向鏈結清單實作。不同於陣列基礎的 List<T>,它透過節點間的雙向指標實現高效的插入/刪除操作,但也帶來了記憶體佈局分散、快取命中率低等副作用。本文將從資料結構、API 設計、效能特徵三個維度深度剖析,幫助開發者做出正確的集合選型決策。
每個節點為 LinkedListNode<T> 實例,包含三個關鍵屬性:
T)nullnull此外,LinkedListNode<T> 還暴露 List 屬性,可反向存取所屬的 LinkedList<T> 容器,便於在節點層級執行 AddAfter、Remove 等操作。
LinkedList<T> 提供四種插入方法:
AddFirst(T) / AddFirst(LinkedListNode<T>)AddLast(T) / AddLast(LinkedListNode<T>)AddAfter(LinkedListNode<T>, T) / AddAfter(...)AddBefore(LinkedListNode<T>, T) / AddBefore(...)所有插入/刪除操作皆為 O(1) 時間複雜度,前提是已持有目標節點參考。但尋找節點需 O(n) 線性掃描,這是效能瓶頸來源之一。
List<T>:元素連續存放於受控堆大型陣列,記憶體局部性極佳,GC 掃描極快。LinkedList<T>:節點分散於堆各處,每個節點皆為獨立物件,GC 需追蹤大量小物件,造成額外負擔。List<T>.Add 遠快於 LinkedList<T>.AddLast(陣列擴容摊還成本 vs 物件配置+GC)。LinkedList<T> 理論優勢明顯,但 List<T>.Insert/RemoveAt 在元素數量較少(< 1000)時因快取友善往往更快。List<T> O(1) 索引器完勝 LinkedList<T> O(n) 遍歷。List<T>.BinarySearch(需排序)O(log n) 遠優於 LinkedList<T> 線性 Find/Contains O(n)。僅在以下極少數場景考慮:
List<T> 移動元素的成本。絕大多數業務場景下,List<T> 或 Array<T> 皆為更優選擇。
LinkedList<T> 是教科書級雙向鏈結清單實作,API 設計優雅,但在現代硬體架構下(快取層級、GC 機制),其效能劣勢極難翻盤。除非有明確的演算法級需求,否則預設應優先選擇 List<T>。理解其內部機制,有助於在面試與架構設計中展現深度技術判斷力。