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?
以下是使用Length的版本
class Solution {
public:
bool isPalindrome(ListNode* head) {
if (head == NULL)
{
return true;
}
int size = getLength(head);
int mid = (size >> 1);
ListNode* pre = NULL;
ListNode* cur = head;
while (mid-->0)
{
ListNode* tmp = cur;
cur = cur->next;
tmp->next = pre;
pre = tmp;
}
ListNode* right = cur;
ListNode* left = pre;
if (size & 1)
{
cur = cur->next;
}
while (cur != NULL)
{
if (cur->val != pre->val)
{
break;
}
cur = cur->next;
pre = pre->next;
}
pre = right;
while (left)
{
ListNode * tmp = left->next;
left->next = pre;
pre = left;
left = tmp;
}
return cur == NULL;
}
private:
int getLength(ListNode* head)
{
int cnt = 0;
while (head)
{
++cnt;
head = head->next;
}
return cnt;
}
};
以下是不需要getLength版本
/**
* 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;
}
ListNode* pre = NULL;
ListNode* step1 = head;
ListNode* step2 = head->next;
while (step2 != NULL)
{
ListNode* next = step1->next;
step1->next = pre;
pre = step1;
step1 = next;
step2 = step2->next;
if (step2 != NULL)
{
step2 = step2->next;
}
else
{
step2 = step1;
break;
}
}
if (NULL == step2)
{
step2 = step1->next;
}
ListNode * left = pre;
while (pre != NULL)
{
if (pre->val != step2->val)
{
break;
}
pre = pre->next;
step2 = step2->next;
}
bool bRet = (pre == NULL);
pre = step1;
while (left)
{
ListNode * tmp = left->next;
left->next = pre;
pre = left;
left = tmp;
}
return bRet;
}
};