【数据结构专项】链表(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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章