Python 3自定义链表遍历异常:仅能遍历到第二个节点
自定义链表遍历仅到第二个节点的问题排查与修复
问题核心原因
你的链表构建逻辑完全错误:在list_node_builder方法中,每次创建节点时,next_node参数传入的是全新创建的孤立节点,而非链表中真正的下一个节点。
比如处理l1=["a","b","c"]时:
- 创建
a节点时,next_node是ListNode("b")(这个b节点的next_node是默认的None) - 后续循环创建
b节点时,是另一个全新的ListNode("b"),和a指向的那个b没有任何关联 - 最终你的"链表"实际上是一串独立节点,每个节点只指向一个存了下一个值但无后续链接的孤立节点,自然遍历到第二个节点就会终止。
修复后的代码
正确的链表构建方式应该从尾到头,或者从头开始依次串联已创建的节点:
from typing import Optional class ListNode: def __init__(self, val, next_node=None): self.val = val self.next_node = next_node @property def value(self): return self.val def __str__(self): return f"Value={self.val}, Next node available={self.next_node.value if self.next_node != None else -1}" class Solution: def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[list]: result_arr = [] curr_node = l1 print("***** Start traversing L1 only ******") while curr_node: print(curr_node) result_arr.append(curr_node.val) curr_node = curr_node.next_node print("***** End traversing L1 only ******") return result_arr def list_node_builder(self, l1: list[str], l2: list[int]) -> list[int]: print("***** Start building Linked List ******") # 正确构建L1链表:倒序遍历,从最后一个节点开始串联 l1_head = None for num in reversed(l1): l1_head = ListNode(num, l1_head) print(l1_head) # 同理构建L2链表 l2_head = None for num in reversed(l2): l2_head = ListNode(num, l2_head) print("***** Done building Linked List ******") return self.addTwoNumbers(l1_head, l2_head)
修复说明
- 链表构建逻辑修正:通过倒序遍历输入列表,每次将新节点的
next_node指向已构建好的链表头部,最终形成完整串联的链表。 - 遍历逻辑简化:直接用
curr_node是否为None作为循环条件,无需额外的l1_running变量,代码更简洁可靠。 - 移除错误的
__dict__赋值:原代码中__dict__ = ("val", "next_node",)会破坏类实例的属性访问逻辑,已移除。
运行验证
修复后调用原测试代码,遍历会输出所有节点:
***** Start building Linked List ****** Value=g, Next node available=-1 Value=f, Next node available=g Value=e, Next node available=f Value=d, Next node available=e Value=c, Next node available=d Value=b, Next node available=c Value=a, Next node available=b ***** Done building Linked List ****** ***** Start traversing L1 only ****** Value=a, Next node available=b Value=b, Next node available=c Value=c, Next node available=d Value=d, Next node available=e Value=e, Next node available=f Value=f, Next node available=g Value=g, Next node available=-1 ***** End traversing L1 only ****** ['a', 'b', 'c', 'd', 'e', 'f', 'g'] ['a', 'b', 'c', 'd', 'e', 'f', 'g']
内容的提问来源于stack exchange,提问作者name_masked
相关产品推荐
相关产品推荐

