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

链表回文判断代码运行异常,请求协助排查问题原因

你的回文链表判断代码的核心问题
  • 反转操作直接破坏了原链表:reverse(head)函数会修改原链表中每个节点的next指针,反转完成后,原链表的头节点head的next会被置为NULL。这导致后续遍历head时,只能访问到第一个节点,根本没法完成整个链表的回文对比,直接引发异常或错误结果。
  • 对比逻辑的次要问题:就算忽略原链表被破坏的问题,当链表长度为奇数时,中间节点会被重复对比,但这不是当前代码异常的主要原因。
修复方案

推荐采用反转链表后半段的方案,空间复杂度更低,还能选择保留原链表结构:

Node* reverse(Node* head) {
    if (head == NULL || head->next == NULL) {
        return head;
    }
    Node* curr = head;
    Node* prev = NULL;
    Node* nx;
    while (curr != NULL) {
        nx = curr->next;
        curr->next = prev;
        prev = curr;
        curr = nx;
    }
    return prev;
}

bool isPalindrome(Node* head) {
    if (head == NULL || head->next == NULL) return true;
    
    // 快慢指针找链表中点
    Node* slow = head;
    Node* fast = head;
    while (fast->next != NULL && fast->next->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
    }
    
    // 反转后半段链表
    Node* rev = reverse(slow->next);
    Node* curr = head;
    
    // 对比前半段和反转后的后半段
    while (rev != NULL) {
        if (curr->data != rev->data) {
            // 可选:恢复原链表结构(如果需要保留输入链表)
            reverse(rev);
            return false;
        }
        curr = curr->next;
        rev = rev->next;
    }
    
    // 可选:恢复原链表结构
    reverse(slow->next);
    return true;
}

修复思路说明

  1. 用快慢指针找到链表中点:快指针每次走两步,慢指针每次走一步,快指针到末尾时,慢指针刚好在链表中间位置。
  2. 反转慢指针之后的后半段链表,这样就能把后半段倒过来和前半段逐一对比。
  3. 对比完成后可以选择把后半段再反转回去,恢复原链表的结构,避免影响后续对链表的使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:32:25