
本文详解如何为双向链表类正确实现 __str__ 方法,避免返回内存地址,而是以 [val1->val2->val3] 格式清晰打印节点数据,并提供完整、可运行的示例代码与关键注意事项。
本文详解如何为双向链表类正确实现 `__str__` 方法,避免返回内存地址,而是以 `[val1->val2->val3]` 格式清晰打印节点数据,并提供完整、可运行的示例代码与关键注意事项。
在 Python 中实现双向链表时,一个常见误区是将 __str__ 方法错误地定义在 Node 类中,或在遍历时未正确访问链表头节点(self.head),导致 AttributeError 或打印出对象内存地址(如 <__main__.node object at></__main__.node>)。正确的做法是:将 __str__ 方法定义在链表容器类(如 DoublyLinkedList)中,由该类统一管理遍历逻辑,并确保只提取并格式化每个节点的 data 字段。
以下是一个结构清晰、生产就绪的双向链表实现示例:
class Node:
def __init__(self, data, prev=None, next=None):
self.data = data
self.prev = prev
self.next = next
class DoublyLinkedList:
def __init__(self):
self.head = None # 链表起始节点(无哨兵节点)
def append(self, data):
"""在链表尾部插入新节点"""
new_node = Node(data)
if not self.head:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
new_node.prev = current
def __str__(self):
"""返回形如 '[1->2->3]' 的字符串表示"""
values = []
current = self.head
while current is not None:
values.append(str(current.data)) # 安全转为字符串,支持任意可 str 类型
current = current.next
return "[" + "->".join(values) + "]"
# 可选:支持反向遍历(体现“双向”特性)
def to_list_reverse(self):
if not self.head:
return []
# 找到尾节点
tail = self.head
while tail.next:
tail = tail.next
# 从尾向前收集
result = []
current = tail
while current:
result.append(str(current.data))
current = current.prev
return result✅ 使用示例:
dll = DoublyLinkedList()
dll.append(10)
dll.append("hello")
dll.append(3.14)
print(dll) # 输出:[10->hello->3.14]
print(dll.to_list_reverse()) # 输出:['3.14', 'hello', '10']⚠️ 关键注意事项:
- ❌ 不要在
Node类中定义__str__来遍历整个链表——这违反封装原则,且Node实例无法访问self._head(该属性属于链表类); - ✅ 确保
__str__中的current = self.head正确初始化,避免AttributeError: 'DoublyLinkedList' object has no attribute '_head'(注意命名一致性,推荐用self.head而非self._head,除非明确需要私有约定); - ✅ 使用
str(current.data)而非str(current),后者会触发Node.__str__(若未定义则默认输出内存地址); - ? 若需支持双向遍历(如反向打印),应单独提供方法(如
to_list_reverse),而非在__str__中耦合逻辑; - ? 对于大规模数据,
join()+ 列表推导比字符串拼接更高效(Python 字符串不可变,频繁+=会产生大量临时对象)。
综上,__str__ 是链表类对外呈现的核心接口之一。通过将其置于容器类、专注数据提取与格式化,并辅以清晰的节点管理逻辑,即可稳健、直观地展示双向链表内容。

















