反转链表II中交换左右循环位置引发NullPointer Exception的原因
链表反转中循环顺序导致空指针异常的原因分析
问题核心
代码A和代码B的唯一区别是寻找左边界、右边界的循环顺序,但代码B触发空指针的本质是:两个循环复用了同一个遍历指针,且第二个循环没有从链表头重新开始遍历,而是沿用第一个循环结束后的指针位置——这看似无关的两个循环,实际上通过共享指针变量产生了隐藏的依赖关系。
具体场景模拟
假设我们有链表:1 -> 2 -> 3 -> 4,输入left=3,right=4,且代码中用同一个cur指针完成两次遍历:
代码A的执行流程
- 先找右边界:
cur从head(节点1)开始,循环移动right-1=3次,最终cur指向节点4(右边界),将cur赋值给right_node。 - 重置指针找左边界:把
cur重新指向head,循环移动left-1=2次,最终cur指向节点3(左边界),赋值给left_node。
整个过程两次遍历都从头节点开始,指针移动次数匹配链表长度,不会出现空指针。
代码B的执行流程
- 先找左边界:
cur从head开始,循环移动left-1=2次,最终cur指向节点3(左边界),赋值给left_node。 - 不重置指针直接找右边界:继续用当前的
cur(节点3)循环移动。如果代码中循环次数计算错误(比如误写成移动right-1=3次而非right-left=1次),就会让cur在移动时试图访问null.next(节点4的next是null,再移动一次就会触发异常)。
关键原因总结
- 代码B的两个循环并非独立,它们共享同一个遍历指针,且第二个循环没有从头节点重新开始,而是从第一个循环的结束位置继续遍历。
- 当第一个循环已经将指针移动到链表中间或末尾时,第二个循环的移动次数若超过当前指针到链表末尾的节点数,就会访问
null的next属性,引发空指针异常。 - 代码A因为先完成右边界遍历后重置了指针,两次遍历都从头开始,避免了这种依赖导致的越界访问。
内容的提问来源于stack exchange,提问作者Dhairya Gupta
相关产品推荐
相关产品推荐

