LeetCode LinkedList Cycle题while语句抛出空指针异常原因求解
环形链表代码空指针异常原因分析
原代码异常触发原因
你最初使用的循环条件while (fast.next.next != null && slow.next != null)会触发空指针的核心原因是未校验fast.next的非空性就直接访问fast.next.next属性,触发场景包括两种:
- 当无环链表长度为1时:
fast初始值等于非空的head节点,此时fast.next本身就是null,直接访问fast.next.next会直接抛出NullPointerException,开头的非空判断无法覆盖这个场景。 - 当无环链表长度≥2时:fast指针每次移动2步,当fast移动到链表最后一个节点时,
fast.next为null,下次循环判断条件时访问fast.next.next同样会触发空指针。
替换后循环条件正常的原因
修改为while (fast != null && fast.next != null)后不会触发异常的原因是:
- Java中逻辑与运算符
&&自带短路特性:如果前半段fast != null判断为false,会直接跳过后半段fast.next != null的判断,不会出现访问null对象属性的情况。 - 只要
fast和fast.next都不为空,访问fast.next.next就是安全的,哪怕fast.next.next本身是null也不会抛出空指针,只会正常终止循环返回false。
另外补充说明:原条件中的slow.next != null判断是冗余的,slow指针每次只移动1步,移动速度只有fast的一半,fast能到达的位置slow必然已经到达,无需单独校验slow的非空性。
内容的提问来源于stack exchange,提问作者mgm89
相关产品推荐
相关产品推荐

