//#234 Palindrome Linked List
//32ms 14.13%
/**
* 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|| !head->next) return true;
//step 1. find middle point using fast-slow pointers
//step 2. reverse the sub linked_list beginning from p1->next;
//step 3. compare two sub linked_list
ListNode *p1(head), *p2(head);
while(p2->next && p2->next->next)
{
p1 = p1->next;
p2 = p2->next->next;
}
//cout << "OK0\n";
if(p1->next && p1->next->next && !p1->next->next->next)
{
p1->next->next->next = p1->next;
p1->next = p1->next->next;
p1->next->next->next = NULL;
}
else if(p1->next && p1->next->next && p1->next->next->next)
{
//cout << "OK1\n";
ListNode *previous_p(p1->next), *current_p(p1->next->next), *next_p(p1->next->next->next);
previous_p->next = NULL;
//cout << "OK1.5\n";
while(next_p != NULL)
{
//cout << "OK1.8\n";
current_p->next = previous_p;
previous_p = current_p;
current_p = next_p;
next_p = next_p->next;
}
//cout << "OK1.9\n";
current_p->next = previous_p;
p1->next = current_p;
}
p2 = head;
p1 = p1->next;
while(p1)
{
if(p1->val != p2->val)
{
return false;
}
else
{
p1 = p1->next;
p2 = p2->next;
}
}
return true;
}
};
[Leetcode]#234 Palindrome Linked List
最新推荐文章于 2024-08-04 16:45:57 发布