# coding:utf-8 # 單向循環鏈表的相關操做: # is_empty() 判斷鏈表是否爲空 # length() 返回鏈表的長度 # travel() 遍歷 # add(item) 在頭部添加一個節點 # append(item) 在尾部添加一個節點 # insert(pos, item) 在指定位置pos添加節點 # remove(item) 刪除一個節點 # search(item) 查找節點是否存在 class Node(object): """節點""" def __init__(self, item): self.elem = item self.next = None class SingleCycleLinkedList(object): """單向循環鏈表""" def __init__(self, node=None): self.__head = node # 若是node不爲空,則須要指向本身構成一個循環鏈表 if node: node.next = node def is_empty(self): """判斷鏈表是否爲空""" return self.__head is None def length(self): """返回鏈表的長度""" if self.is_empty(): return 0 else: cur = self.__head count = 1 while cur.next is not self.__head: count += 1 cur = cur.next return count def travel(self): """遍歷""" if self.is_empty(): return else: cur = self.__head while cur.next is not self.__head: print(cur.elem, end=" ") cur = cur.next # 循環結束,cur指向尾節點,可是尾節點元素還沒有打印,須要單獨輸出 print(cur.elem) def add(self, item): """在頭部添加一個節點,頭插法""" node = Node(item) if self.is_empty(): self.__head = node node.next = node else: # 須要獲取到尾節點 cur = self.__head while cur.next is not self.__head: cur = cur.next node.next = self.__head self.__head = node cur.next = node def append(self, item): """在尾部添加一個節點,尾插法""" node = Node(item) if self.is_empty(): self.__head = node node.next = node else: # 一樣須要獲取到尾節點 cur = self.__head while cur.next is not self.__head: cur = cur.next cur.next = node node.next = self.__head def insert(self, pos, item): """在指定位置pos添加節點""" if pos <= 0: self.add(item) elif pos > (self.length() - 1): self.append(item) else: node = Node(item) prev = self.__head count = 0 while count < pos - 1: count += 1 prev = prev.next # 循環結束,prev指向要插入位置的前一個元素 node.next = prev.next prev.next = node def remove(self, item): """刪除一個節點,須要考慮鏈表是否爲空,刪除的節點是頭節點,尾節點,仍是中間節點""" if self.is_empty(): return else: cur = self.__head pre = None while cur.next is not self.__head: if cur.elem == item: # 判斷是頭節點,仍是中間節點 if cur is self.__head: # 頭節點,須要找到尾節點 rear = self.__head while rear.next is not self.__head: rear = rear.next self.__head = cur.next rear.next = self.__head else: # 中間節點 pre.next = cur.next return else: pre = cur cur = cur.next # 退出循環,cur指向尾節點 if cur.elem == item: # 注意判斷鏈表中是否只有一個節點 if cur is self.__head: self.__head = None else: pre.next = self.__head def search(self, item): """查找節點是否存在""" if self.is_empty(): return False else: cur = self.__head while cur.next is not self.__head: if cur.elem == item: return True else: cur = cur.next # 循環結束,cur指向尾節點,可是尾節點並未參與比較,須要單獨進行判斷的 if cur.elem == item: return True else: return False if __name__ == "__main__": scll = SingleCycleLinkedList() print("befor initialized:", scll.is_empty()) print("befor initialized:", scll.length()) scll.add(1) scll.add(2) scll.add(3) scll.add(4) scll.add(5) scll.add(6) scll.travel() scll.append(7) scll.travel() scll.insert(3, 99) scll.travel() print("scll.search(99):", scll.search(99)) scll.remove(99) scll.travel()