Java链表去环时跟踪lastNode触发NullPointerException问题
问题分析与修复
问题根源
你的代码在处理尾节点直接指向头节点的环时,第二个while循环完全不会执行:
- 快慢指针第一次相遇时,
slow和fast都停在Head节点(因为环是尾节点直接指向头,快慢指针第一次碰面就在起点) - 此时
slow != fast的条件不成立,循环体没有运行,prev保持初始的null值 - 执行
prev.next = null自然会抛出NullPointerException
修复方案
需要先判断相遇节点是否就是头节点,如果是,说明环是尾节点指向头,此时要找到尾节点(即最后一个指向头的节点),再把它的next设为null。修改后的removeCycle方法如下:
public static int removeCycle(){ Node slow = Head; Node fast = Head; boolean Cycle = false; while(fast !=null && fast.next != null){ slow = slow.next; fast = fast.next.next; count++; if(slow == fast){ Cycle =true; break; } } if(!Cycle){ return 0; } // 处理环为尾节点直接指向头节点的情况 if(slow == Head){ Node temp = Head; // 找到最后一个指向Head的节点(尾节点) while(temp.next != Head){ temp = temp.next; } temp.next = null; return 1; } // 处理普通环的情况,按原逻辑执行 slow = Head; Node prev=null; while(slow != fast){ prev = fast; slow = slow.next; fast = fast.next; } prev.next =null; return 1; }
额外修正:main方法的输出逻辑
原main方法最后一行System.out.println(Head.next.next.next.next.data);会抛出NPE,因为修复后Head.next.next.next.next是null,无法直接访问data。改成以下代码:
// 正确打印最后节点的next状态 Node lastNode = Head.next.next.next; System.out.println(lastNode.next); // 预期输出null
测试结果
修复后运行代码,输出符合预期:
1 null
内容的提问来源于stack exchange,提问作者SBM
相关产品推荐
相关产品推荐

