節點變量會初始化為None值或者一個新的None對象。
class Node(object): def __init__(self, data, next=None): self.data = data self.next = next # 僅僅是空鏈接 node1 = None # 一個包含數據和空鏈接的節點 node2 = Node("A") # 一個包含數據和鏈接node2的節點 node3 = Node("B", node2)
下圖表示在運行該節點之后3個變量的狀態:
注意如下情況:
- node1沒有指向節點對象(是None)。
- node2和node3指向所鏈接到的對象。
- node2指向一個對象,其下一個指針為None。
現在,假設你試圖運行如下的語句,在已經包含了node2和node3的鏈接結構的開頭位置添加一個節點:
node1.next = node3
python會拋出一個AttributeError作為響應。作出這一響應的原因是,變量node1包含了值None,因此不會引用包含了一個next字段的對象。
要創建我們想要的鏈接,如下:
node1 = Node("c", node3)
或者,如下:
node1 = Node("c") node1.next = node3
通常在嘗試訪問一個給定的節點變量之前。我們可以通過詢問其是否為None。從而保證其不發生意外:
if nodeVariable != None: <access a field in nodeVariable>
像數組一樣,鏈表結構也是用循環來處理的。可以使用循環來創建一個鏈表結構,並且訪問其中的每一個節點。
下面是測試腳本使用了Node類來創建一個單鏈表結構,並且輸出其內容:
# coding: utf-8 class Node(object): def __init__(self, data, next=None): self.data = data self.next = next head = None for count in range(1,6): head = Node(count, head) while head != None: print head.data head = head.next
關於這個程序,注意以下幾點:
- 指針head生成了鏈表結構。這個以這樣一種方式操作,最近插入的項總是位於結構的開始處。
- 因此,當顯示數據的時候,他們按照插入時相反的順序出現。
- 此外,當顯示數據的時候,head指針重新設置為下一個節點直到head指針變為None。因此,這個過程的最后,節點實際上從鏈表結構中刪除了。對於順序來說,節點不可再用,並且會在下一次垃圾回收的時候回收。
結束!