python 實現迴圈連結串列
阿新 • • 發佈:2022-03-10
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 單鏈表測試 # Author: yunhgu # Date: 2022/3/10 15:48 # Description: # ------------------------------------------------------------------------------- class Node(object): """連結串列的結點""" def __init__(self, item): # item存放資料元素 self.item = item # next是下一個節點的標識 self.next = None class SingleCycleLinkList(object): def __init__(self): self._head = None def is_empty(self): """判斷連結串列是否為空""" return self._head is None def length(self): """連結串列長度""" # 連結串列為空 if self.is_empty(): return 0 # 連結串列不為空 count = 1 cur = self._head while cur.next != self._head: count += 1 # 指標下移 cur = cur.next return count def items(self): """ 遍歷連結串列 """ # 連結串列為空 if self.is_empty(): return # 連結串列不為空 cur = self._head while cur.next != self._head: yield cur.item cur = cur.next yield cur.item def add(self, item): """ 頭部新增結點""" node = Node(item) if self.is_empty(): # 為空 self._head = node node.next = self._head else: # 新增結點指向head node.next = self._head cur = self._head # 移動結點,將末尾的結點指向node while cur.next != self._head: cur = cur.next cur.next = node # 修改 head 指向新結點 self._head = node def append(self, item): """尾部新增結點""" node = Node(item) if self.is_empty(): # 為空 self._head = node node.next = self._head else: # 尋找尾部 cur = self._head while cur.next != self._head: cur = cur.next # 尾部指標指向新結點 cur.next = node # 新結點指標指向head node.next = self._head def insert(self, index, item): """ 指定位置新增結點""" if index <= 0: # 指定位置小於等於0,頭部新增 self.add(item) # 指定位置大於連結串列長度,尾部新增 elif index > self.length() - 1: self.append(item) else: node = Node(item) cur = self._head # 移動到新增結點位置 for i in range(index - 1): cur = cur.next # 新結點指標指向舊結點 node.next = cur.next # 舊結點指標 指向 新結點 cur.next = node def remove(self, item): """ 刪除一個結點 """ if self.is_empty(): return cur = self._head pre = Node # 第一個元素為需要刪除的元素 if cur.item == item: # 連結串列不止一個元素 if cur.next != self._head: while cur.next != self._head: cur = cur.next # 尾結點指向 頭部結點的下一結點 cur.next = self._head.next # 調整頭部結點 self._head = self._head.next else: # 只有一個元素 self._head = None else: # 不是第一個元素 pre = self._head while cur.next != self._head: if cur.item == item: # 刪除 pre.next = cur.next return True else: pre = cur # 記錄前一個指標 cur = cur.next # 調整指標位置 # 當刪除元素在末尾 if cur.item == item: pre.next = self._head return True def find(self, item): """ 查詢元素是否存在""" return item in self.items() if __name__ == '__main__': link_list = SingleCycleLinkList() print(link_list.is_empty()) # 頭部新增元素 for i in range(5): link_list.add(i) print(list(link_list.items())) # 尾部新增元素 for i in range(6): link_list.append(i) print(list(link_list.items())) # 新增元素 link_list.insert(3, 45) print(list(link_list.items())) # 刪除元素 link_list.remove(5) print(list(link_list.items())) # 元素是否存在 print(4 in link_list.items()) print(link_list.find(0))