單向循環鏈表
阿新 • • 發佈:2018-05-02
list() print 測試 單向循環鏈表 lse DC klist elif AC
寫給自己看的筆記, 很多坑
標準版
class Node(object): def __init__(self, item): self.elem = item self.next = None class xunhuanLinkList(object): def __init__(self, node=None): self.__head = node if node: node.next = node def is_empty(self):View Codereturn self.__head is None def length(self): if self.is_empty(): return 0 else: cur = self.__head count = 1 while cur.next != self.__head: count += 1 cur = cur.next return countdef tarvel(self): if self.is_empty(): return "空鏈表" else: cur = self.__head while cur.next != self.__head: print(cur.elem, end=(" ")) cur = cur.next print(cur.elem, end=" ") print("")def add(self, item): node = Node(item) if self.is_empty(): node.next = node self.__head = node else: cur = self.__head while cur.next != 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 != self.__head: cur = cur.next node.next = self.__head cur.next = node def insert(self, pos, item): if self.is_empty and pos <= 0: self.add(item) elif pos >= (self.length() - 1): self.append(item) else: cur = self.__head count = 0 while count != (pos - 1): count += 1 cur = cur.next node = Node(item) node.next = cur.next cur.next = node def search(self, item): if self.is_empty(): return False else: cur = self.__head while cur.next != self.__head: if cur.elem == item: return True else: cur = cur.next if cur.elem == item: return True return False def remove(self, item): if self.is_empty(): return False else: cur = self.__head pro = None while cur.next != self.__head: if cur.elem == item: if cur == self.__head: weiba = self.__head while weiba.next != self.__head: weiba = weiba.next self.__head = cur.next weiba.next = self.__head else: pro.next = cur.next return else: pro = cur cur = cur.next if cur.elem == item: if cur == self.__head: self.__head = None else: pro.next = cur.next
註釋版
class Node(object): def __init__(self, item): # 這是一個節點類,內部的初始化函數, 此類的每一個實例對象都會擁有此函數內部的屬性 # 創建一個節點, 此節點包含元素域,next域 self.elem = item self.next = None class xunhuanLinkList(object): def __init__(self, node=None): # 這是一個鏈表類, 內部的初始化函數, 此類的每一個實例獨享都會擁有此函數內部的屬性 self.__head = node # 創建頭節點, node = None, 鏈表默認的node指向None, 以傳遞進來的node為準 if node: # 如果node不為空, node的next域指向node(自身) node.next = node # 如果node為空, node的next域指向None """self.is_empty() 等價於 self.__head == None""" """cur.next != self.__head, 該條件是判斷此節點是否為鏈表的未節點""" def is_empty(self): # 判斷是否為空 return self.__head is None # 如果self.__head頭節點指向None,代表該鏈表為空, 返回True # 反之, 返回False def length(self): # 判斷鏈表的償付 if self.is_empty(): # 如果鏈表為空 return 0 else: # 鏈表不為空 cur = self.__head # 創建遊標cur, 指向頭節點 count = 1 # 以計數的方式來計算長度 while cur.next != self.__head: # cur.next != self.__head, 該條件是如果不是最後一個節點, 則一直循環 count += 1 # 計數加一 cur = cur.next # 遊標向後移動一位 return count # 註意: 當循環結束後, 遊標指向最後一個節點, # 註意: 當鏈表只有一個節點的時候,怎麽辦 def tarvel(self): # 遍歷列表 if self.is_empty(): # 如果鏈表為空直接返回 return "空鏈表" else: # 如果鏈表不為空 cur = self.__head # 創建遊標 while cur.next != self.__head: # 如果不是尾節點, 則一直循環 print(cur.elem, end=(" ")) # 循環一次打印一下, 當前節點的值 cur = cur.next # 遊標後移一位 print(cur.elem, end=" ") # 當循環結束的時候, 遊標指向最後一個節點, 但並沒有進入循環體, 沒有打印最後一個節點的值, # 所以在循環結束後, 打印一下尾節點的值 print("") # 該函數指向完畢, 換行操作 def add(self, item): # 鏈表頭部添加節點 node = Node(item) # 創建一個新節點(node), 該節點的elem元素值為item if self.is_empty(): # 如果鏈表為空 node.next = node # 該節點的next域指向自身 self.__head = node # 將鏈表的頭節點指向node節點 else: # 鏈表不為空 cur = self.__head # 創建遊標, 尋找尾節點 while cur.next != self.__head: # 如果該遊標指向的不是尾節點, 則後移一位 cur = cur.next # 當循環結束後, 遊標指向尾節點 node.next = self.__head # 新節點(node)的next域指向原鏈表的頭節點 self.__head = node # 鏈表的頭節點指向新節點node cur.next = node # 等價於cur.next = self.__head # 尾節點的next域, 指向鏈表的頭節點 def append(self, item): # 鏈表尾部追加節點 node = Node(item) # 創建一個新節點node if self.is_empty(): # 鏈表為空 self.__head = node # 將鏈表的頭部指向新節點node node.next = node # node的next域指向node(自身) else: cur = self.__head # 創建遊標 while cur.next != self.__head: # 如果不是最後一個節點, 則一直循環 cur = cur.next # 遊標後移一位 node.next = self.__head # 將node的next域, 指向鏈表的頭部 cur.next = node # 等價於 cur.next = self.__head(上步代碼標識node為鏈表的頭節點) # 尾節點的next域,指向鏈表的頭節點 def insert(self, pos, item): # 指定位置,插入元素 if self.is_empty and pos <= 0: # 如果鏈表為空或者pos指定位置小於0, 則執行在鏈表頭部添加節點 self.add(item) elif pos >= (self.length() - 1): # 如果指定位置, 大於尾節點的下標, 則執行尾部追加 self.append(item) else: cur = self.__head # 創建遊標 count = 0 # 以計數的方式找到指定下標處 while count != (pos - 1): # 找到指定下標節點的前驅節點處 count += 1 # 計數加一 cur = cur.next # 遊標後移 node = Node(item) # 創建一個新節點node node.next = cur.next # 循環結束後, 遊標指向, 指定下標的前驅節點位置處 # 讓node的next域指向, 遊標cur節點的後繼節點處 cur.next = node # 讓遊標cur節點的next域, 指向新節點node def search(self, item): # 查找元素 if self.is_empty(): # 如果鏈表為空, 返回False return False else: # 反之 cur = self.__head # 創建遊標 while cur.next != self.__head: # 遍歷所有元素 if cur.elem == item: # 如果遊標指向的當前節點的elem元素等於要查找的元素, 返回True return True else: # 如果沒有找到, 遊標後移一位 cur = cur.next # 循環結束後, 遊標指向最後一個節點, 該節點並沒有進入循環體內, 所以要判斷最後一個元素是否為要查找的item if cur.elem == item: return True return False # 註意點: 1. 鏈表為空, 2. 鏈表只有一個節點 3. item為最後一個節點 def remove(self, item): # 鏈表為空 # 鏈表只有一個節點 # 要查找的元素是首節點 # 要查找的元素是尾節點 if self.is_empty(): # 如果鏈表為空, 返回False return False else: # 鏈表不為空 cur = self.__head pro = None # 創建兩個遊標, cur當前元素, pro前驅元素 while cur.next != self.__head: # 遍歷元素到尾節點 if cur.elem == item: # 找到item的節點 if cur == self.__head: # 首節點 weiba = self.__head while weiba.next != self.__head: weiba = weiba.next # 循環結束遊標weiba指向尾節點 self.__head = cur.next weiba.next = self.__head else: # 中間節點 pro.next = cur.next # 當找到item節點之後, 執行完代碼直接退出 return else: pro = cur cur = cur.next # 循環結束後cur指向尾節點 if cur.elem == item: if cur == self.__head: # 鏈表只有一個節點 self.__head = None else: pro.next = cur.nextView Code
測試代碼
if __name__ == "__main__": tll = xunhuanLinkList() print(tll.is_empty()) print(tll.length()) tll.append(1) tll.tarvel() print(tll.is_empty()) print(tll.length()) tll.add(2) tll.tarvel() tll.append(1) tll.tarvel() tll.add(100) tll.tarvel() tll.append(2) tll.append(4) tll.append(5) tll.append(6) tll.tarvel() tll.insert(1, 3) tll.tarvel() print(tll.search(2)) print(tll.search(900)) tll.remove(3) tll.tarvel() tll.remove(2) tll.tarvel() tll.remove(1) tll.tarvel() print(tll.search(1)) print(tll.search(10))View Code
單向循環鏈表