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

判断Linked List是否为回文时反转全列表对比失效?指针指向问题

问题根因分析

你的第二段代码无法正常运行的核心原因是:C#中ListNode是引用类型,你对指针的操作都是直接修改原链表的节点结构,并没有生成新的链表副本。

详细逻辑拆解

  • 你写的ListNode second=head; 并没有复制出一条独立的新链表,只是让second指针和head(以及你后续赋值的first指针)指向了同一个链表的首节点,所有节点都是共享的。
  • 调用Reverse(second)时,方法内部直接修改了每个节点的next指向:原链表的首节点的next会被置为null,第二个节点的next指向首节点,以此类推,整条原链表的结构被完全反转。
  • 这时候你用来对比的first指针虽然还是指向原首节点,但原首节点的next已经是null了,遍历的时候最多只能读到第一个节点的值,自然不可能完成正确的对比。

第一段代码可以正常运行的原因

第一段代码仅反转了后半段链表,前半段节点的next指向没有被修改,原链表前半段的遍历逻辑完全不受影响,因此可以正常完成前后半段的对比。

如果你想要用「反转整条链表对比」的逻辑实现,需要先深拷贝原链表:

public bool IsPalindrome(ListNode head) {
    // 先深拷贝一份原链表
    ListNode copyHead = new ListNode(head.val);
    ListNode p = head.next;
    ListNode q = copyHead;
    while(p != null){
        q.next = new ListNode(p.val);
        q = q.next;
        p = p.next;
    }
    // 反转拷贝后的链表,不会影响原链表结构
    ListNode reversedCopy = Reverse(copyHead);
    ListNode first = head;
    while(reversedCopy != null && first != null){
        if(reversedCopy.val != first.val) return false;
        reversedCopy = reversedCopy.next;
        first = first.next;
    }
    return true;
}

// Reverse方法复用原有逻辑即可
public ListNode Reverse(ListNode slow){
    ListNode prev=null;
    while(slow!=null){
        ListNode next=slow.next;
        slow.next=prev;
        prev=slow;
        slow=next;
    }
    return prev;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:02