>>> link_list.append(5) >>> print(link_list.head) print(link_list.head.data) print(link_list.head.next) print(link_list.tail) print(link_list.tail.data) print(link_list.tail.next) <__main__.Node object at 0x000001FE0C61C0F0> 4 <__main__.Node object at 0x000001FE0C613E80> <__main__.Node object at 0x000001FE0C613E80> 5 None
產生器
在 LinkedList 類別建立一個 iter() 函式,以疊代鏈表的所有節點。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
>>> defiter(self): # 如果 head 節點為 None(形成 not False),則直接返回 None ifnot self.head: return # 將 cur 設為 head 節點 cur = self.head # 產生第一個節點的値 yield cur.data # 直到 cur 的 next 指向 None 値 while cur.nextisnotNone: # 將 cur 設為下一個節點 cur = cur.next # 產生下一個節點的値 yield cur.data
>>> defremove(self, idx): cur = self.head cur_idx = 0 # 如果 head 節點為空,則抛出例外 if cur isNone: raise Exception('串列為空') # 從 0 開始疊代到指定索引 - 1 while cur_idx < idx - 1: # 指定索引的前一個節點 cur = cur.next # 如果指定索引的前一個節點的 next 為空,則抛出例外 if cur.nextisNone: raise Exception('索引超過範圍') # 每一次疊代都把 cur_idx 加上 1 cur_idx += 1 # 如果刪除的節點為第一個,則將 head 節點和 cur 指向原來 head 節點的 next if idx == 0: self.head = cur.next cur = cur.next # 不再往下執行 return # 如果鏈表只有一個節點,則將 head 節點和 tail 節點都設為空 if self.head is self.tail: self.head = None self.tail = None # 不再往下執行 return # 將指定索引的前一個節點的 next 指向下一個節點的 next cur.next = cur.next.next # 如果刪除的節點為最後一個,則將 tail 節點指向 cur if cur.nextisNone: self.tail = cur
程式碼第 12 列改判斷 cur.next 是否為空。
刪除一個節點。
1 2 3 4 5
>>> link_list.remove(1) >>> for i in link_list.iter(): print(i) 4 5
獲取節點個數
在 LinkedList 類別建立一個 size() 函式,以獲取鏈表的節點個數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
>>> defsize(self): cur = self.head count = 0 # 如果 head 節點為空,則返回字串 if cur isNone: return'串列為空' # 直到 cur 為 None 値 while cur isnotNone: # 將 cur 設為下一個節點 cur = cur.next # 每一次疊代都把 count 加上 1 count += 1 # 返回個數 return count
獲取鏈表的節點個數。
1 2
>>> link_list.size() 1
查找節點
在 LinkedList 類別建立一個 search() 函式,以查找指定値。
1 2 3 4 5 6 7 8 9 10 11 12 13
>>> defsearch(self, item): cur = self.head found = False # 直到 cur 的 next 指向 None 値或 found 是 Ture while cur isnotNoneandnot found: # 如果 cur 的値是指定値,則 found 是 True(停止疊代) if cur.data == item: found = True # 否則將 cur 設為下一個節點(繼續疊代) else: cur = cur.next # 返回布林値 return found