在學習資料結構時,Node(節點) 是最基本的組成單元,就像建築物的磚塊一樣重要。理解節點的概念,能為進一步學習鏈結串列、堆疊、佇列、樹和圖等資料結構打下堅實基礎。
掌握節點的設計與操作,不僅能幫助我們理解資料結構的運作方式,也能提升程式設計的思維能力。
什麼是 Node(節點)?
基本定義
Node 是一個獨立的資料容器,每個節點通常包含兩個主要部分:
- 資料 (Data):儲存實際的值,例如數字、字串或物件。
- 連結 (Link/Pointer):指向下一個節點的參考。
終止標記
當鏈結到最後一個節點時,連結設為 None
,代表結束。
Python節點實現
我們將使用包含數據和一個指向另一個節點連結的基本節點。節點的數據在創建時指定且不可變更,而連結在初始化時是可選的,可以後續更新。
- 沒有指標:Python 不像 C/C++ 使用指標,我們透過物件參考來實現。
- 物件屬性:使用類別屬性儲存資料和連結。
- 動態連結:可以在程式執行時,隨時修改節點的連結關係。
基本 Node 類別
class Node:
def __init__(self, value, link_node=None):
self.value = value # 資料
self.link_node = link_node # 下一個節點(預設 None)
這是一個最簡單的 Node 類別,包含兩個核心屬性:
value
:存放資料(不可變)。link_node
:指向下一個節點(可變)。
Getter 方法:取得資料
def get_value(self):
return self.value
def get_link_node(self):
return self.link_node
get_value()
回傳節點儲存的實際資料值
get_link_node()
回傳指向下一個節點的參考
Getter 方法提供安全的方式來存取節點的內部資料,遵循封裝的物件導向設計原則。
Setter 方法:更新連結
def set_link_node(self, link_node):
self.link_node = link_node
為什麼只有連結可以更新?
資料一旦設定就不應該改變,但連結需要靈活調整來建立不同的資料結構排列。
安全性考量
限制資料的修改可以避免意外的資料損壞,同時保持結構調整的彈性。
建立節點實例
建立節點與鏈結
node1 = Node("A")
node2 = Node("B")
node3 = Node("C")
建立連結關係
node1.set_link_node(node2)
node2.set_link_node(node3)
此時,我們得到一個 A → B → C 的鏈結結構。
遍歷節點
設定起始點
從第一個節點開始遍歷
檢查是否結束
當遇到 None 時停止遍歷
移動到下一個
透過 get_link_node() 繼續
current = node1
while current is not None:
print(current.get_value())
current = current.get_link_node()
輸出:
A
B
C
Nodes 的應用場景
1. 鏈結串列 (Linked List)
由節點依序連接,形成線性結構。
2. 堆疊 (Stack)
後進先出(LIFO),用於函數呼叫或運算處理。
3. 佇列 (Queue)
先進先出(FIFO),常見於排程或緩衝區設計。
4. 樹 (Tree)
階層式結構,例如檔案系統、分類器。
5. 圖 (Graph)
表示複雜網路關係,如社交網路或路徑規劃。
結語
節點是所有進階資料結構的基石。當你能夠靈活建立與操作節點後,就能進一步學習 Linked List(鏈結串列) 的完整操作,並逐步邁向更複雜的結構。