Python基于列表创建双向链表:代码运行异常问题排查求助
问题排查与修正:Python双向链表实现错误
我来帮你梳理代码里的问题,你的双向链表实现有几个关键错误导致无法正常运行,咱们逐个拆解:
1. 初始化阶段的致命属性错误
在DoublyList的__init__方法开头,你直接写了:
self.head.next = self.head.prev = self.head
这时候self.head还是None,直接访问None的next/prev属性会立刻抛出AttributeError,这是程序启动就崩溃的核心原因。如果你的目标是做循环双向链表,这段代码也得等head被初始化后再执行;如果是普通双向链表,这段代码完全没必要。
2. 尾节点变量未绑定类属性
你在代码里用了局部变量tail,但从来没把它赋值给self.tail。第一次初始化时tail = n只是创建了一个局部变量,后续循环里的tail.next = n操作的是这个局部变量,而类的self.tail属性始终是None,这会导致链表节点的关联逻辑彻底混乱。
3. 未维护双向链表的prev指针
双向链表的核心是每个节点既要记录next也要记录prev,但你的代码只设置了tail.next = n,没有把新节点的prev指向之前的尾节点,这不仅失去了双向链表的特性,还会导致后续反向遍历等操作完全失效。
修正后的完整代码
针对这些问题,我调整了逻辑,实现了一个普通的双向链表(如果需要循环双向链表可以再做修改):
class Node: def __init__(self, data): self.data = data self.next = None self.prev = None class DoublyList: def __init__(self, a): self.head = None self.tail = None self.size = 0 for i in a: n = Node(i) self.size += 1 if self.head is None: # 第一个节点,head和tail都指向它 self.head = n self.tail = n else: # 关联新节点和尾节点的双向指针 self.tail.next = n n.prev = self.tail # 更新尾节点为新节点 self.tail = n def showList(self): current = self.head while current is not None: print(current.data, end=" ") current = current.next print() # 换行 # 测试代码 lst = [10, 20, 30] d = DoublyList(lst) d.showList() # 输出:10 20 30
额外优化建议
- 如果需要反向遍历,可以加一个
showReverseList方法,从self.tail开始遍历到None。 - 如果要实现循环双向链表,只需要在初始化最后添加
self.head.prev = self.tail和self.tail.next = self.head,同时修改showList的终止条件(比如遍历到回到head为止)。
内容的提问来源于stack exchange,提问作者Shakib
相关产品推荐
相关产品推荐

