我试图解决leetcode中的问题以确认回文链表(problem description)。但是当我检查具有偶数节点的链表时,总是存在运行时错误。
我的代码的基本思想是:
分别使用名为fast
和slow
的两个指针。在while循环中,使用移动到下一个节点的slow
指针,并使用移动到下一个节点的fast
指针。当fast
指针到达列表末尾时,slow
指针应保留在链表的中间。反转slow
指针后面的链接列表的一半,并将反向链接列表中的项目与上一个链接列表的前半部分逐一进行比较。
这是我的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//https://discuss.leetcode.com/topic/61648/o-n-time-and-o-1-space-4ms-java-solution
struct ListNode* reverse(struct ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
struct ListNode *rest = reverse(head->next);
head->next->next = head;
head->next = NULL;
return rest;
}
bool isPalindrome(struct ListNode* head) {
if(head == NULL || head->next == NULL)
return true;
struct ListNode *fast, *slow;
fast = head;
slow = head;
while(fast->next != NULL && fast != NULL)
{
slow = slow->next;
fast = fast->next->next;
}
if(fast != NULL && fast->next == NULL)
slow = slow->next;
fast = head;
struct ListNode *rest = reverse(slow);
slow->next = NULL;
while(fast != NULL && rest != NULL)
{
if(fast->val != rest->val)
{
return false;
}
fast = fast->next;
rest = rest->next;
}
return true;
}
有人可以帮我指出错误的位置吗?感谢。