You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python双向链表实现队列遇参数错误问题求助

基于双向链表实现队列的错误排查与正确实现

问题背景

已实现可正常运行的双向链表,计划基于它实现队列结构,但实例化Queue(2)时触发参数错误,同时不确定队列的实现逻辑是否正确,需要明确Python中基于已有数据结构实现新结构的规范。

复现代码与错误信息

运行以下代码:

import import_ipynb
from Queue import *

x=Queue(2)
x.offer(3)

报错内容:

Queue.__init__() takes from 0 to 1 positional arguments but 2 were given

现有代码

双向链表代码

class Node:
    def __init__(self,data):
        self.data=data
        self.prev=None
        self.next=None

    def __repr__(self):
        return f"<Node data:{self.data} Previous Node:{self.prev} Next Node:{self.next}>"
    
class DoublyLinkedList:
    def __init__(self):
        self.size=0
        self.head=None
        self.tail=None

    # 添加元素到链表尾部
    def addL(self,data):
        new_node=Node(data)
        if self.isEmpty()==True:
            self.head=self.tail=new_node
        else:
            self.tail.next=new_node
            new_node.prev=self.tail
            self.tail=new_node
        self.size+=1

(注:代码中调用了isEmpty方法但未实现,需补充)

队列代码

import import_ipynb
from DoublyLinkedList import *

class Queue:
    def __init__(firstElem=None):
        list=DoublyLinkedList()
        list.addL(firstElem)

    # 添加元素到队尾
    def offer(val):
        return list.addL(val)

错误原因与修正方案

1. 类实例方法缺失self参数

Python中类的实例方法(包括构造方法__init__)必须将self作为第一个参数,它代表当前实例本身。你的Queue类中__init__和offer方法都未声明该参数,导致Python把传入的2误认为是self,进而判定参数数量不匹配。

2. 未将链表实例绑定为类属性

__init__中定义的list是局部变量,方法执行完毕后会被销毁,offer方法无法访问到该链表实例。需用self.list将其声明为实例属性,确保类内所有方法都能调用。

3. 初始元素边界处理缺失

当firstElem为None时,直接调用addL(None)会向队列中添加无效元素,需要增加判断逻辑,仅当firstElem不为None时才执行添加操作。

4. 队列核心方法缺失

队列的核心操作除了入队(offer),还需实现出队(poll)、查看队首(peek)、判断为空等方法,基于双向链表的特性,队首对应链表的head节点,需补充从头部移除元素的逻辑。

修正后的完整代码

补充双向链表的isEmpty方法

class DoublyLinkedList:
    # ... 已有代码 ...
    def isEmpty(self):
        return self.size == 0

修正后的队列代码

import import_ipynb
from DoublyLinkedList import *

class Queue:
    def __init__(self, firstElem=None):
        self.list = DoublyLinkedList()
        if firstElem is not None:
            self.list.addL(firstElem)

    # 添加元素到队尾
    def offer(self, val):
        self.list.addL(val)

    # 移除并返回队首元素,队列为空时返回None
    def poll(self):
        if self.list.isEmpty():
            return None
        head_data = self.list.head.data
        # 处理链表仅含一个节点的情况
        if self.list.head == self.list.tail:
            self.list.head = self.list.tail = None
        else:
            self.list.head = self.list.head.next
            self.list.head.prev = None
        self.list.size -= 1
        return head_data

    # 返回队首元素,队列为空时返回None
    def peek(self):
        return self.list.head.data if not self.list.isEmpty() else None

    # 判断队列是否为空
    def is_empty(self):
        return self.list.isEmpty()

    # 获取队列大小
    def size(self):
        return self.list.size

测试验证

import import_ipynb
from Queue import *

x = Queue(2)
x.offer(3)
print(x.peek())    # 输出:2
print(x.poll())    # 输出:2
print(x.peek())    # 输出:3
print(x.is_empty())# 输出:False
print(x.size())    # 输出:1

内容的提问来源于stack exchange,提问作者mertk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:33:30