[LeetCode]234. Palindrome Linked List
题目描述
思路
首先找到中点
然后将前半段链表逆转
最后比较
代码
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
int size = 0;
while (fast) {
slow = slow->next;
fast = fast->next;
++size;
if (fast) {
fast = fast->next;
++size;
}
}
if (size <= 1)
return true;
size >>= 1;
ListNode* pre = head;
ListNode* cur = head->next;
ListNode* next = head->next->next;
pre->next = NULL;
for (int i = 1; i < size; ++i) {
cur->next = pre;
pre = cur;
cur = next;
next = next->next;
}
cur = pre;
/*
while (cur) {
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
*/
for (int i = 0; i < size; ++i) {
if (cur->val != slow->val)
return false;
cur = cur->next;
slow = slow->next;
}
return true;
}
};
int main() {
ListNode* l1 = new ListNode(1);
ListNode* l2 = new ListNode(2);
ListNode* l3 = new ListNode(1);
ListNode* l4 = new ListNode(2);
ListNode* l5 = new ListNode(1);
l1->next = l2;
l2->next = l3;
l3->next = l4;
l4->next = l5;
Solution s;
cout << s.isPalindrome(l1) << endl;
system("pause");
return 0;
}