【数据结构专项】链表(4) —— 用单链表实现队列(Python)

用单链表实现队列

队首位於单链表的头结点处,队尾位於单链表的尾结点处,维护头指针、尾指针和链表长度;加入元素时依据尾指针添加到尾结点后,取出元素时候依据头指针取出元素并删除头结点。

class LinkedQueue:
    """单链表实现的队列"""

    class _Node:
        """"""
        __slots__ = "value", "next"  # 因为会创建很多个结点对象,因此使用__slots__来减少内存占用

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

    def __init__(self):
        self._head = None  # 头指针
        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._head.value

    def pop(self):
        """取出队首元素"""
        if self.is_empty():
            raise ValueError("Queue is Empty")
        ans = self._head.value
        self._head = self._head.next
        self._size -= 1
        if self.is_empty():
            self._tail = None
        return ans

    def add(self, value):
        """元素加入队尾"""
        node = self._Node(value, None)  # 构造链表对象
        if self.is_empty():
            self._head = node
        else:
            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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章