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

如何输出双向链表实际前驱节点?Python代码prev显示{...}问题

双向链表节点打印时prev显示{...}的原因与解决方法

为什么会显示{...}?

这是Python处理循环引用的内置机制。你的双向链表中,每个节点的prev指向前一个节点,而前一个节点的next又指向当前节点——比如节点11的prev是节点10,节点10的next是节点11,形成了循环引用。

当Python尝试递归打印字典形式的节点时,发现已经遍历过某个节点,就会用{...}代替该节点的完整内容,避免无限递归导致程序崩溃。

如何输出实际的节点信息?

我们可以通过自定义打印逻辑,避开循环引用的递归遍历,只提取我们需要的关键信息。下面提供几种可行的方案:

方案1:自定义链表打印方法

直接遍历链表,逐个打印每个节点的value以及前后节点的value(而非完整节点对象):

class LinkedList:
    def __init__(self,value):
        self.head = {
            'value':value,
            'next':None,
            'prev':None,
        }
        self.tail = self.head
        self.length = 1
    def append(self, value):
        newnode = {
            'value':value,
            'next':None,
            'prev':None,
        }
        newnode['prev'] = self.tail
        self.tail['next'] = newnode
        self.tail = newnode
        self.length +=1
        return self.head
    
    # 新增自定义打印方法
    def print_nodes(self):
        current_node = self.head
        while current_node:
            # 提取前后节点的value(不存在则显示None)
            prev_val = current_node['prev']['value'] if current_node['prev'] else None
            next_val = current_node['next']['value'] if current_node['next'] else None
            print(f"节点: value={current_node['value']}, prev={prev_val}, next={next_val}")
            current_node = current_node['next']

# 测试
a = LinkedList(10)
a.append(11)
a.append(3)
a.print_nodes()

执行后输出:

节点: value=10, prev=None, next=11
节点: value=11, prev=10, next=3
节点: value=3, prev=11, next=None

方案2:用类实现节点并自定义__repr__

如果想更规范地管理节点,建议用类代替字典实现节点,然后自定义__repr__方法控制打印格式:

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
        self.prev = None
    
    # 自定义节点的打印格式
    def __repr__(self):
        prev_val = self.prev.value if self.prev else None
        next_val = self.next.value if self.next else None
        return f"Node(value={self.value}, prev={prev_val}, next={next_val})"

class LinkedList:
    def __init__(self, value):
        self.head = Node(value)
        self.tail = self.head
        self.length = 1
    
    def append(self, value):
        new_node = Node(value)
        new_node.prev = self.tail
        self.tail.next = new_node
        self.tail = new_node
        self.length +=1
        return self.head

# 测试
a = LinkedList(10)
a.append(11)
a.append(3)

# 遍历打印所有节点
current = a.head
while current:
    print(current)
    current = current.next

执行后输出:

Node(value=10, prev=None, next=11)
Node(value=11, prev=10, next=3)
Node(value=3, prev=11, next=None)

方案3:序列化节点为JSON格式

如果需要结构化输出,可以使用json模块自定义序列化逻辑,只保留必要信息:

import json

def serialize_node(node):
    if node is None:
        return None
    return {
        'value': node['value'],
        'prev': node['prev']['value'] if node['prev'] else None,
        'next': node['next']['value'] if node['next'] else None
    }

def serialize_linked_list(linked_list):
    nodes = []
    current = linked_list.head
    while current:
        nodes.append(serialize_node(current))
        current = current['next']
    return nodes

# 测试
a = LinkedList(10)
a.append(11)
a.append(3)
print(json.dumps(serialize_linked_list(a), indent=2))

执行后输出:

[
  {
    "value": 10,
    "prev": null,
    "next": 11
  },
  {
    "value": 11,
    "prev": 10,
    "next": 3
  },
  {
    "value": 3,
    "prev": 11,
    "next": null
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:47:16