using
System;
using
System.Collections.Generic;
class
GfG
{
class
Node
{
public
int
data;
public
Node next;
}
static
Node getLoopstart(Node loop_node,
Node head)
{
Node ptr1 = loop_node;
Node ptr2 = loop_node;
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;
}
static
Node detectAndgetLoopstarting(Node head)
{
Node slow_p = head, fast_p = head,loop_start =
null
;
while
(slow_p !=
null
&& fast_p !=
null
&&
fast_p.next !=
null
)
{
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;
}
static
bool
isPalindromeUtil(Node head,
Node loop_start)
{
Node ptr = head;
Stack<
int
> s =
new
Stack<
int
> ();
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.Peek())
s.Pop();
else
return
false
;
if
(ptr == loop_start)
count = 1;
ptr = ptr.next;
}
return
true
;
}
static
bool
isPalindrome(Node head)
{
Node loop_start = detectAndgetLoopstarting(head);
return
isPalindromeUtil(head, loop_start);
}
static
Node newNode(
int
key)
{
Node temp =
new
Node();
temp.data = key;
temp.next =
null
;
return
temp;
}
public
static
void
Main(String[] args)
{
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;
if
(isPalindrome(head) ==
true
)
Console.WriteLine(
"Palindrome"
);
else
Console.WriteLine(
"Not Palindrome"
);
}
}