【數據結構專項】鏈表(5) —— 用循環鏈表實現隊列

用循環鏈表實現隊列

隊首位於單鏈表的頭結點處,隊尾位於單鏈表的尾結點處,尾結點的指針域指向頭結點;維護尾指針和鏈表長度;當加入元素時,依據尾指針在尾結點後添加新元素,取出元素時候依據尾指針,取出尾結點指向的頭結點元素並刪除頭結點。

class CircularQueue:
    """用循環鏈表實現隊列"""

    class _Node:
        """"""
        __slots__ = "value", "next"  # 因爲會創建很多個結點對象,因此使用__slots__來減少內存佔用

        def __init__(self, value, next):
            self.value = value
            self.next = next

    def __init__(self):
        self._tail = None  # 尾指針
        self._size = 0  # 隊列的元素數量

    def __len__(self):
        """返回隊列中元素的數量"""
        return self._size

    def is_empty(self):
        """返回隊列是否爲空"""
        return self._size == 0

    def first(self):
        """查詢隊首元素"""
        if self.is_empty():
            raise ValueError("Queue is Empty")
        return self._tail.next.value

    def pop(self):
        """取出隊首元素"""
        if self.is_empty():
            raise ValueError("Queue is Empty")
        head = self._tail.next
        if self._size == 1:
            self._tail = None
        else:
            self._tail.next = head.next  # 令尾結點直接指向原頭結點的下一個結點
        self._size -= 1
        return head.value

    def add(self, value):
        """元素加入隊尾"""
        node = self._Node(value, None)  # 構造鏈表對象
        if self.is_empty():
            node.next = node
        else:
            node.next = self._tail.next  # 令新結點指向頭結點
            self._tail.next = node  # 令原來的尾結點指向新結點
        self._tail = node  # 令尾指針指向新的尾結點(即新結點)
        self._size += 1

操作的時間複雜度:

操作 時間複雜度
len(S) O(1)O(1)
S.is_empty() O(1)O(1)
S.first() O(1)O(1)
S.pop() O(1)O(1)
S.add(value) O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章