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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:50:22