線性表(四):單向迴圈連結串列(待更正)
阿新 • • 發佈:2020-10-11
引言
上文筆者描述了單鏈表的基本操作,但尾插法在單鏈表中效率太低,我們可以對單鏈表進行簡單的變形,提高尾端插入元素等操作的效率。
單向迴圈連結串列
單向迴圈連結串列只需要將普通的單鏈表首尾相連即可實現。
Python實現:
class ListNode(): def __init__(self, val, next=None): self.val = val self.next = next class OneWayCircularLinkedList(): def __init__(self): self.head = None # 在連結串列頭部插入元素 def prepend(self, val): # 若頭部結點為空,那麼頭尾結點相同 node = ListNode(val) if not self.head: self.head = node self.head.next = self.head else: cur = self.head while cur.next != self.head: cur = cur.next cur.next = node node.next = self.head # 在連結串列尾部插入元素 def append(self, val): if not self.head: self.head = ListNode(val) self.head.next = self.head else: cur = self.head while cur.next != self.head: cur = cur.next cur.next = ListNode(val, self.head) # 計算連結串列長度 def get_length(self): if not self.head: return 0 cur = self.head length = 1 while cur.next != self.head: length += 1 cur = cur.next return length # 彈出尾部元素 def pop_last(self): if not self.head: raise ValueError('self.head 必須非空') if self.head.next == self.head: return self.head.val cur = self.head while cur.next.next != self.head: cur = cur.next rear = cur.next.val cur.next = cur.next.next return rear if __name__ == '__main__': def testfunction(node): nums = [] cur = node while cur.next != node: nums.append(cur.val) cur = cur.next nums.append(cur.val) return nums sample = OneWayCircularLinkedList() for i in range(8): sample.prepend(i) print(testfunction(sample.head)) sample.append(2) print(testfunction(sample.head)) print(sample.get_length()) print(sample.pop_last())
總結
不難發現,單向迴圈連結串列的優勢在於頭尾相連,此時尾端插入的效率較高。
參考資料
- 裘宗燕.資料結構與演算法——Python語言描述[M].北京:機械工業出版社,2015: 78-91。