Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
基本思路:
1. 先用快慢指针,找到链表的中间结点。
2. 将后半段进行逆转
3. 将前半段和经过逆转的后半段进行逐个比较。
此题不得不修改链表,这到底算不算O(1) space呢
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (!head) return true;
ListNode *walker = head;
ListNode *runner = head->next;
while (runner && runner->next) {
walker = walker->next;
runner = runner->next;
runner = runner->next;
}
runner = walker->next;
walker = NULL;
while (runner) {
auto bak = runner->next;
runner->next = walker;
walker = runner;
runner = bak;
}
while (walker && walker->val == head->val) {
walker = walker->next;
head = head->next;
}
return !walker;
}
};