链表转换代码修改后触发AttributeError的原因及相关疑问
链表代码修改后报错的原因解析
正确的列表转链表实现
class ListNode: def __init__(self, val=0, next=None) -> None: self.val = val self.next = next def list_link(nums): dummy = ListNode() curr = dummy for i in nums: curr.next = ListNode(i) #line6 curr = curr.next
修改后触发错误的代码
class ListNode: def __init__(self, val=0, next=None) -> None: self.val = val self.next = next def list_link(nums): dummy = ListNode() curr = dummy for i in nums: curr.next = i #line6 curr = curr.next
运行修改后的代码会触发错误:AttributeError: 'int' object has no attribute 'next'
问题解析
1. 报错的核心原因
链表的本质是由**ListNode类的实例**串联而成的,每个节点实例都自带val(存储数据)和next(指向下一个节点)两个属性。
在正确代码里,curr.next = ListNode(i)是创建了一个新的ListNode实例:把数值i存在这个实例的val字段里,同时这个实例自带next属性,能继续串联后续节点。
但修改成curr.next = i后,你是直接把整数i赋值给了curr.next——整数是Python的基础数据类型,根本没有next属性。当执行下一行curr = curr.next时,curr就变成了这个整数,下一次循环再尝试访问curr.next时,自然会触发“整数没有next属性”的错误。
2. 关于curr的属性疑问
最初的curr是dummy(ListNode()创建的实例),所以确实具备val和next属性。但在修改后的代码中,第一次循环执行curr = curr.next后,curr就变成了整数i,此时它不再是链表节点,也就失去了val和next属性,这才导致后续循环报错。
内容的提问来源于stack exchange,提问作者Varun Vishwa
相关产品推荐
相关产品推荐

