请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 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 == nullptr)
return true;
else if (head->next == nullptr)
return true;
ListNode * f = head;
ListNode * s = head;
while(f != nullptr && f->next != nullptr)
{
s = s->next;
f = f->next->next;
}
// reverse the first half list
ListNode * pre, * next;
pre = nullptr;
while(head != s)
{
next = head->next;
head->next = pre;
pre = head;
head = next;
}
head = pre;
// move s a step more if the total number is odd
if (f != nullptr)
s = s->next;
while(head != nullptr && s != nullptr)
{
if (head->val != s->val)
return false;
head = head->next;
s = s->next;
}
return true;
}
};