Problem
Solution
题意为给定一个链表,每个节点存一个0~9的数字,叫你判断这个链表的内容是否为一个回文串。
思路就是利用快慢指针,快指针每次走两步,慢指针每次走一步,当快指针抵达链表尾部的时候,慢指针到达链表中间,需要注意的是,因为回文串是正读泛读都一样的字符串,因此慢指针移动时,我们需要把链表前半部分的next指针做一个reverse,这样我们就可以在o(n)时间o(1)空间判断是否是回文了。
按照这个思路,我写了以下代码
写的逻辑很混乱
虽然自己测试没什么问题,但是submit会报错
如果你看出是什么问题,请不吝赐教给我留言
class Solution {
public:
bool isPalindrome(ListNode *head) {
if (head == nullptr || head->next == nullptr) return true;
ListNode *slow = head;
ListNode *fast = head;
ListNode *pre = head;
ListNode *nxt = head->next;
bool odd = false;
while (true) {
if (fast == nullptr) break;
if (fast->next == nullptr) {
odd = true;
break;
}
fast = fast->next->next;
slow = nxt;
nxt = slow->next;
if (fast == nullptr) break;
// if (fast->next == nullptr) {
// odd = true;
// break;
// }
slow->next = pre;
pre = slow;
}
// return true;
ListNode *p = nullptr;
ListNode *q = nullptr;
if (odd) {
p=pre->next;
q=nxt;
} else {
p=pre;
q=slow;
}
while (q) {
if (p->val != q->val) return false;
q = q->next;
p = p->next;
}
return true;
}
};
以下代码是在discuss里面大佬的代码,逻辑十分清晰,代码很简洁,学习了!
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (!head || !head->next) return true;
ListNode *slow = head, *fast = head, *pre = nullptr, *nxt=nullptr;
while (fast != nullptr && fast->next != nullptr){
fast=fast->next->next;
nxt=slow->next;
slow->next=pre;
pre=slow;
slow=nxt;
}
if(fast) slow=slow->next;
while(slow){
if(slow->val!=pre->val) return false;
slow=slow->next;
pre=pre->next;
}
return true;
}
};