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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:03:10