/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* newHead = new ListNode();
int nodeLen = getLength(head);
int halfLen = (nodeLen+1) / 2;
int halfLen1 = nodeLen / 2;
ListNode* fakeHead1 = new ListNode();
ListNode* fakeHead2 = new ListNode();
fakeHead1->next = fakeHead2;
fakeHead2->next = head;
ListNode* ptr = head;
ListNode* ptr2 = fakeHead1;
// reverse sort by halfLen
for (int i = 0; i < halfLen; ++i)
{
fakeHead2->next = ptr->next;
ptr->next = fakeHead1->next;
fakeHead1->next = ptr;
ptr = fakeHead2->next;
ptr2 = ptr2->next;
}
// compare along fakeHead1, fakeHead2
fakeHead1 = fakeHead1->next;
if (nodeLen % 2 == 1)
fakeHead1 = fakeHead1->next;
fakeHead2 = fakeHead2->next;
for (int i = 0; i < halfLen1; ++i)
{
if (fakeHead1->val != fakeHead2->val)
{
return false;
}
fakeHead1 = fakeHead1->next;
fakeHead2 = fakeHead2->next;
}
return true;
}
private:
int getLength(ListNode* head)
{
int len = 0;
while (head != nullptr)
{
head = head->next;
len++;
}
return len;
}
};