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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:25:47