Python链表报错'NoneType' object has no attribute 'val'原因咨询
链表代码报错:'NoneType' object has no attribute 'val' 原因与解决
问题根源
代码1能正常运行的核心是先确认节点有效,再访问属性:
while node:会先检查当前node是否为None,只有节点存在才进入循环体。- 先打印当前节点的
val,再将node移动到下一个节点。当最后一个节点处理完成后,node变为None,循环直接终止,不会执行任何访问None属性的操作,自然不会报错。
你提供的代码2(或实际运行的代码)报错的原因在于先移动节点,再尝试访问属性:
- 如果是循环打印场景,当处理到最后一个有效节点(比如
val=3的节点)时,执行node = node.next后,node会变成None,此时再执行print(node.val),必然触发NoneType属性访问错误。 - 若你仅执行两行代码却出现打印
2后报错的情况,大概率是重复执行了移动操作,导致node最终变为None后仍强行访问其val属性。
解决办法
根据你的需求分两种场景给出正确写法:
1. 仅打印初始节点的val
直接打印即可,不要先移动节点:
print(node.val) # 若需要移动节点,放在打印操作之后 node = node.next
2. 循环打印所有节点的val
严格遵循「判断→访问→移动」的顺序,和代码1保持一致:
while node: print(node.val) node = node.next
如果一定要先移动节点(无实际业务意义,仅作演示),必须增加节点有效性判断:
# 先打印第一个节点 print(node.val) node = node.next # 循环打印剩余节点 while node: print(node.val) node = node.next
核心要点
操作链表节点时,必须先确保节点不是None,再访问它的val或next属性。None是链表的终止标志,不具备任何链表节点的属性。
内容的提问来源于stack exchange,提问作者Sir Absolute 0
相关产品推荐
相关产品推荐

