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;
}
};