Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2 Output: false
Example 2:
Input: 1->2->2->1 Output: true
Follow up:
Could you do it in O(n) time and 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 == NULL )
return true;
if ( head->next == NULL )
return true;
ListNode * slow = head;
ListNode * fast = head;
while(fast->next!=NULL&&fast->next->next!=NULL)
{
slow = slow->next;
fast = fast->next->next;
}
slow->next = reverselist(slow->next);
slow = slow->next;
while(slow&&head)
{
if( slow->val != head->val )
return false;
slow = slow->next;
head = head->next;
}
return true;
}
ListNode * reverselist( ListNode * head )
{
if ( head == NULL || head->next == NULL )
return head;
ListNode *pre = NULL;
ListNode *cur = head;
while(cur)
{
ListNode *next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
};