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

反转链表II中交换左右循环位置引发NullPointer Exception的原因

链表反转中循环顺序导致空指针异常的原因分析

问题核心

代码A和代码B的唯一区别是寻找左边界、右边界的循环顺序,但代码B触发空指针的本质是:两个循环复用了同一个遍历指针,且第二个循环没有从链表头重新开始遍历,而是沿用第一个循环结束后的指针位置——这看似无关的两个循环,实际上通过共享指针变量产生了隐藏的依赖关系。

具体场景模拟

假设我们有链表:1 -> 2 -> 3 -> 4,输入left=3,right=4,且代码中用同一个cur指针完成两次遍历:

代码A的执行流程

  1. 先找右边界:cur从head(节点1)开始,循环移动right-1=3次,最终cur指向节点4(右边界),将cur赋值给right_node。
  2. 重置指针找左边界:把cur重新指向head,循环移动left-1=2次,最终cur指向节点3(左边界),赋值给left_node。
    整个过程两次遍历都从头节点开始,指针移动次数匹配链表长度,不会出现空指针。

代码B的执行流程

  1. 先找左边界:cur从head开始,循环移动left-1=2次,最终cur指向节点3(左边界),赋值给left_node。
  2. 不重置指针直接找右边界:继续用当前的cur(节点3)循环移动。如果代码中循环次数计算错误(比如误写成移动right-1=3次而非right-left=1次),就会让cur在移动时试图访问null.next(节点4的next是null,再移动一次就会触发异常)。

关键原因总结

  • 代码B的两个循环并非独立,它们共享同一个遍历指针,且第二个循环没有从头节点重新开始,而是从第一个循环的结束位置继续遍历。
  • 当第一个循环已经将指针移动到链表中间或末尾时,第二个循环的移动次数若超过当前指针到链表末尾的节点数,就会访问null的next属性,引发空指针异常。
  • 代码A因为先完成右边界遍历后重置了指针,两次遍历都从头开始,避免了这种依赖导致的越界访问。

内容的提问来源于stack exchange,提问作者Dhairya Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:44:49