#include<bits/stdc++.h>
using
namespace
std;
struct
Node
{
int
data;
struct
Node * next;
};
Node* getLoopstart(Node *loop_node,
Node *head)
{
Node *ptr1 = loop_node;
Node *ptr2 = loop_node;
unsigned
int
k = 1, i;
while
(ptr1->next != ptr2)
{
ptr1 = ptr1->next;
k++;
}
ptr1 = head;
ptr2 = head;
for
(i = 0; i < k; i++)
ptr2 = ptr2->next;
while
(ptr2 != ptr1)
{
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
return
ptr1;
}
Node* detectAndgetLoopstarting(Node *head)
{
Node *slow_p = head, *fast_p = head,
*loop_start;
while
(slow_p && fast_p &&
fast_p->next)
{
slow_p = slow_p->next;
fast_p = fast_p->next->next;
if
(slow_p == fast_p)
{
loop_start = getLoopstart(slow_p,
head);
break
;
}
}
return
loop_start;
}
bool
isPalindromeUtil(Node *head,
Node* loop_start)
{
Node *ptr = head;
stack<
int
> s;
int
count = 0;
while
(ptr != loop_start || count != 1)
{
s.push(ptr->data);
if
(ptr == loop_start)
count = 1;
ptr = ptr->next;
}
ptr = head;
count = 0;
while
(ptr != loop_start || count != 1)
{
if
(ptr->data == s.top())
s.pop();
else
return
false
;
if
(ptr == loop_start)
count = 1;
ptr = ptr->next;
}
return
true
;
}
bool
isPalindrome(Node* head)
{
Node* loop_start =
detectAndgetLoopstarting(head);
return
isPalindromeUtil(head,
loop_start);
}
Node *newNode(
int
key)
{
Node *temp =
new
Node;
temp->data = key;
temp->next = NULL;
return
temp;
}
int
main()
{
Node *head = newNode(50);
head->next = newNode(20);
head->next->next = newNode(15);
head->next->next->next =
newNode(20);
head->next->next->next->next =
newNode(50);
head->next->next->next->next->next =
head->next->next;
isPalindrome(head)? cout <<
"Palindrome"
: cout << "
Not Palindrome";
return
0;
}