Problem
Given a singly linked list, determine if it is a palindrome.
Example1
Input: 1->2
Output: false
Example2
Input: 1->2->2->1
Output: true
Solution
/**
* 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) {
int n = 0;
for (auto p = head; p; p = p->next) //链表长度
n ++ ;
if (n <= 1) return true; //翻转后半段
int half = n / 2;
auto a = head;
for (int i = 0; i < n - half; i ++ )
a = a->next;
auto b = a->next;
for (int i = 0; i < half - 1; i ++ ) {
auto c = b->next;
b->next = a;
a = b, b = c;
}
auto p = head, q = a;//对比两段链表
bool success = true;
for (int i = 0; i < half; i ++ ) {
if (p->val != q->val) {
success = false;
break;
}
p = p->next;
q = q->next;
}
auto tail = a;
b = a->next;
// 将链表恢复原状
for (int i = 0; i < half - 1; i ++ ) {
auto c = b->next;
b->next = a;
a = b, b = c;
}
tail->next = NULL;
return success;
}
};