基于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
相关产品推荐
相关产品推荐

