1. 程式人生 > >學習筆記-迴圈單鏈表(Python實現)

學習筆記-迴圈單鏈表(Python實現)

迴圈單鏈表是單鏈表的一種變形,其最後一個結點的next域不再是None,而是指向表的第一個結點

在迴圈列表物件中記錄表尾結點,可以實現O(1)時間的表頭/表尾插入O(1)時間的表頭刪除

由於迴圈連結串列中的結點連成一個圈,哪個結點是表頭或表尾,主要是概念問題,從表的形態上無法區分。

以下實現了一個簡單的迴圈單鏈表類,其中包含了幾個典型的操作:

class Node:
    def __init__(self, elem):
        self.elem = elem
        self.pnext = None
    def __repr__(self):  # 這個函式將內容友好
地顯示出來,否則會顯示物件的記憶體地址 return str(self.elem) class LCList: def __init__(self): self.rear = None def is_empty(self): """ 判斷該連結串列是否為空 :return: boolean """ return self.rear == None def prepend(self, elem): # 前端插入 p = Node(elem) if self.rear is None: p.pnext = p #
建立一個結點的環 self.rear = p else: p.pnext = self.rear.pnext self.rear.pnext = p def append(self, elem): # 尾端插入 self.prepend(elem) self.rear = self.rear.pnext def pop_start(self): # 前端彈出 if self.rear is None: print("The list is None.") return
p = self.rear.pnext if self.rear is p: # 如果只有一個元素 self.rear = None else: self.rear.pnext = p.pnext # rear的指標等於第二個元素的地址 return p.elem def printall(self): if self.is_empty(): return p = self.rear.pnext print("Head", end=' ') while True: print("-->", p.elem, end=' ') if p is self.rear: break p = p.pnext print("--> None. Linked node finished") if __name__ == '__main__': node1 = Node(elem='node1') node2 = Node(elem='node2') lclist = LCList() lclist.append(node1) lclist.append(node2) lclist.printall() print(lclist.pop_start()) lclist.printall()