链表回文判断代码运行异常,请求协助排查问题原因
你的回文链表判断代码的核心问题
- 反转操作直接破坏了原链表:
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; }
修复思路说明
- 用快慢指针找到链表中点:快指针每次走两步,慢指针每次走一步,快指针到末尾时,慢指针刚好在链表中间位置。
- 反转慢指针之后的后半段链表,这样就能把后半段倒过来和前半段逐一对比。
- 对比完成后可以选择把后半段再反转回去,恢复原链表的结构,避免影响后续对链表的使用。
内容的提问来源于stack exchange,提问作者Aditya Choudhary
相关产品推荐
相关产品推荐

