import
java.util.*;
class
GfG{
static
class
Node
{
int
data;
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
boolean
isPalindromeUtil(Node head,
Node loop_start)
{
Node ptr = head;
Stack<Integer> s =
new
Stack<Integer> ();
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
boolean
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
)
System.out.println(
"Palindrome"
);
else
System.out.println(
"Not Palindrome"
);
}
}