知識回顧
與數組相似,鏈表是一種線性數據結構。鏈表中的每個元素都是一個單獨的對象(結點/節點,Node), 每個元素除了存儲自己本身的信息(數據域)之外,還存儲一個指示下一個元素位置的引用字段(指針域)。
單鏈表
單鏈表的每個結點包含值和下一個結點的引用字段。單鏈表結點的典型定義如下:
# 單鏈表結點的典型定義
class ListNode:
def __init__(self, val):
self.val = val
self.next = None
環形鏈表:特殊的單鏈表,尾結點的引用字段指向鏈表中的某一結點。
循環鏈表:特殊的環形鏈表,尾結點的引用字段指向鏈表的頭結點。
相交鏈表:兩個擁有不同頭結點的單鏈表,相交於某一結點。
雙鏈表
雙鏈表的每個結點除了包含值和下一個結點的引用字段外,還包括前一個結點的引用字段。雙鏈表結點的典型定義如下:
# 雙鏈表結點的典型定義
class DoublyListNode(ListNode):
def __init__(self, val):
super().__init__(val)
self.prev = None
鏈表的常用名詞
線性表:線性表是n個具有相同特性的數據元素的有限序列,常見的線性表存儲結構包括數組和鏈表。
結點:鏈表中的元素,至少由存儲數據元素信息的數據域和存儲後繼結點位置的指針域組成。
數據域:結點中存儲數據元素信息的域。
指針域/引用字段:結點中存儲下一個結點(後繼結點)位置的域。
頭指針:鏈表中第一個結點的存儲位置。
頭結點:鏈表的第一個結點。
尾結點:鏈表的最後一個結點。
常用操作的時間複雜度對比
數組(Array) | 單鏈表(Singly Linked List) | 雙鏈表(Doubly Linked List) | 隊列(Queue) | 棧(Stack) | |
---|---|---|---|---|---|
讀取:給定座標 | |||||
添加:在第一個元素之前 | |||||
添加:在給定元素之後 | |||||
添加:在最後一個元素之後 | |||||
刪除:第一個元素 | |||||
刪除:給定元素 | |||||
刪除:最後一個元素 | |||||
查找:指定的元素值 |
鏈表更適合於頻繁添加和刪除結點的情境。