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

GFG回文Linked List验证:反转后原链表仅打印一个节点,求错因

链表反转后原链表遍历仅输出首节点的问题分析

我在GFG练习平台写代码验证链表是否为回文,测试链表是1->2->1。调用反转链表方法后,遍历原链表只输出一个节点;但注释掉反转的代码后,遍历输出正常。

原代码如下:

class Solution
{
    //Function to check whether the list is palindrome.
    boolean isPalindrome(Node head) 
    {
        Node temp=head;
        Node reversed= reverseList(temp);
        Node cur = head;
        
        while(cur!=null)
        {
            System.out.println(cur.data+"    inloop");
            cur=cur.next;
        }
         
        return true;
    } 

    Node reverseList(Node node)
    {        
        Node prev = null;
        Node current = node;
        Node next = null;
        while (current != null) {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        node = prev;
        return node; 
    }
}

现象

  • 调用reverseList(temp)后,输出仅为:
    1    inloop
    
  • 注释掉Node reversed= reverseList(temp);后,输出符合预期:
    1    inloop
    2    inloop
    1    inloop
    

错误原因

Java里对象是引用传递,temp只是head的引用副本,指向的是同一个链表节点对象。在reverseList方法中,第一个循环就把原链表首节点(也就是head指向的节点)的next改成了null——因为初始prev是null,执行current.next = prev时,原链表的第一个节点就和后面的节点断开了。所以后续遍历head时,只能走到第一个节点就结束。

修正思路

要避免修改原链表,有两种常见方案:

  • 方案1:反转前先复制整个链表,再对复制后的链表进行反转操作,这样原链表的结构不会被破坏。
  • 方案2:用快慢指针找到链表的中间节点,只反转链表的后半部分,这样既不影响原链表前半部分,还能节省空间(不需要复制整个链表),这也是验证回文链表的最优解法之一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:05:46