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?
这个问题可以用O(n)的空间来做,但是如果用O(1)的空间的话,只能考虑其他的方法了。
链表经常用到的方法就是快慢指针,如果用快慢指针的话,把链表分为前一半和后一半,但顺序还是反的,就反转一下。
/**
* 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==NULL || head->next == NULL) return true;
ListNode* fast = head;
ListNode* slow = head;
while(true){
if(fast->next && fast->next->next)
fast = fast->next->next;
else
break;
slow = slow->next;
}
ListNode* half = slow->next;
half = reverse(half);
while(half){
if(half->val != head->val)return false;
half = half->next;
head = head->next;
}
return true;
}
ListNode* reverse(ListNode* head){
if(head == NULL || head->next == NULL)return head;
ListNode* tmp = reverse(head->next);
head->next->next = head;
head->next = NULL;
return tmp;
}
};