linked chain illustration

Python 資料結構:鏈結串列(Linked List)(02)

Linked List(鏈結串列)是一種由節點(Node)組成的動態線性結構。每個節點像火車車廂般彼此相連:前者指向後者,最後一節以 None 作為終點。理解鏈結串列,能為後續的 Stack、Queue、Tree、Graph 打下穩固基礎。

什麼是 Linked List?

基本概念

  • Linked List:由多個節點依序串接而成的線性資料結構。
  • 非連續記憶體:節點在記憶體中不需連續存放,靠「連結(指標)」維持關係。
linked chain illustration

節點的組成

  • 資料(Data):任意型別(數字、字串、物件…)。
  • 連結(Link/Pointer):指向下一個節點;最後一節指向 None

與陣列的比較

  • Linked List 優勢
    • 動態大小:可彈性增刪節點
    • 插入/刪除高效:更新指標即完成(通常 O(1))
    • 無需預先分配連續空間
  • 陣列優勢
    • 隨機存取 O(1)
    • 記憶體局部性佳、快取友善

鏈結串列基本功能

有了節點類別後,我們可以開始建構實際的鏈結串列。根據使用需求,可以定義各種方法。

取得頭節點

獲取串列的第一個節點,就像查看隊伍中的第一個項目

新增節點

在串列開頭添加新的節點

列印串列

按順序印出串列中的所有值

移除節點

刪除具有特定值的節點

LinkedList 類別:初始化與基本結構

class LinkedList:
    def __init__(self, value=None):
        self.head_node = Node(value) if value else None
    
    def get_head_node(self):
        return self.head_node
  • head_node 是整個串列的起點;藉由它能遍歷全串列。
  • 可選擇以初始值建立第一個節點,或以空串列(None)起步。
python class structure diagram

插入新節點(O(1))

將新節點插在串列開頭,不需遍歷,效率極高。

def insert_beginning(self, new_value):
    new_node = Node(new_value)
    new_node.set_link_node(self.head_node)
    self.head_node = new_node

流程

  1. new_value 建立新節點
  2. 新節點連到目前的 head
  3. 更新 head 為新節點

列印串列(遍歷)

將整條串列轉為易讀字串(如 "a -> b -> c"):

def stringify_list(self):
    values = []
    current_node = self.head_node
    while current_node:
        values.append(str(current_node.get_value()))
        current_node = current_node.get_link_node()
    return " -> ".join(values)

遍歷步驟

  1. head 開始
  2. 逐一取值並前進到下一節點
  3. None 代表結束

刪除節點(移除第一個匹配值)

需要處理兩種情況:刪除 head、刪除中間節點。

def remove_node(self, value_to_remove):
    current_node = self.head_node
    
    # 刪除 head
    if current_node and current_node.get_value() == value_to_remove:
        self.head_node = current_node.get_link_node()
        return
    
    # 刪除中間節點
    while current_node:
        next_node = current_node.get_link_node()
        if next_node and next_node.get_value() == value_to_remove:
            current_node.set_link_node(next_node.get_link_node())
            break
        current_node = next_node
  • 刪除 head:直接把 head 指向下一個節點。
  • 刪除中間節點:讓前一節點跳過目標節點,改連到其下一節點。
  • Python 會自動進行 垃圾回收(Garbage Collection),無參考的節點會被釋放。
linked list delete middle node

使用範例

# 建立新串列
ll = LinkedList()

# 插入(頭插,逆序形成 a -> b -> c)
ll.insert_beginning("c")
ll.insert_beginning("b")
ll.insert_beginning("a")

print(ll.stringify_list())      # a -> b -> c

# 刪除節點
ll.remove_node("b")
print(ll.stringify_list())      # a -> c

執行流程

  1. 空串列起步
  2. 依序頭插 c, b, a → 實際順序為 a -> b -> c
  3. 移除 ba -> c

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

High Quality

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Fast Delivery

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.

Best Warranty

Lorem ipsum dolor sit amet, consectetur adipiscing elitsed do eiusmod tempor.