1. 程式人生 > 實用技巧 >線性表(四):單向迴圈連結串列(待更正)

線性表(四):單向迴圈連結串列(待更正)

引言

上文筆者描述了單鏈表的基本操作,但尾插法在單鏈表中效率太低,我們可以對單鏈表進行簡單的變形,提高尾端插入元素等操作的效率。

單向迴圈連結串列

單向迴圈連結串列只需要將普通的單鏈表首尾相連即可實現。

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())

總結

不難發現,單向迴圈連結串列的優勢在於頭尾相連,此時尾端插入的效率較高。

參考資料

  1. 裘宗燕.資料結構與演算法——Python語言描述[M].北京:機械工業出版社,2015: 78-91。