数据结构与算法|链表(5)——用循环链表实现队列(Python)

本文介绍了一种使用循环链表实现队列的数据结构方法,详细解释了如何通过维护尾指针和链表长度,实现在队尾添加元素和从队首取出元素的操作。这种方法在插入和删除操作上具有O(1)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用循环链表实现队列

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

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)O(1)
S.is_empty()O(1)O(1)O(1)
S.first()O(1)O(1)O(1)
S.pop()O(1)O(1)O(1)
S.add(value)O(1)O(1)O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值