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

Java LinkedList反转报错:为何方案B可行而方案A出现循环错误?

链表反转代码报错原因分析

第一段反转链表的代码运行时会抛出「Error - Found cycle in the ListNode」错误,第二段代码却能正常运行,两者看似逻辑相似,核心差异在于是否处理了原链表头节点的next指针,直接导致了环的产生。

报错的代码(方案A)

public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode current = head.next;
        while (current != null) {
            //move current to front of list
            ListNode temp = current.next;
            current.next = head;
            head = current;
            current = temp;
        }
        return head;
    }

正常运行的代码(方案B)

public ListNode reverseList(ListNode head) {
        ListNode curr = head;
        ListNode prev = null;
        while (curr != null) {
            //move current to front of list
            ListNode temp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = temp;
        }
        return prev;
    }

核心差异:原头节点的next指针未被重置

  • 方案A中,初始head指向原链表的第一个节点,current从第二个节点开始循环。每次循环只修改current的next指向当前head,然后更新head为current,但原第一个节点的next指针始终指向原第二个节点(也就是反转后的第二个节点)。当循环结束后,原第一个节点变成了反转链表的尾节点,但它的next并没有被设为null,而是指向反转链表的第二个节点,这样就形成了一个环:反转后的头节点 → ... → 原头节点 → 反转后的第二个节点 → ... → 原头节点,触发了环检测错误。
  • 方案B中,用prev初始化为null,每次循环将curr.next指向prev。当处理原第一个节点时,它的next会被设为null,成为反转链表的尾节点,整个链表是单向无环的,自然不会报错。

举个简单例子:假设原链表是1→2→3

  • 方案A执行后,最终链表是3→2→1,但1.next=2,形成3→2→1→2→...的环
  • 方案B执行后,最终链表是3→2→1→null,无环,正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:26:15