class
Node:
def
__init__(
self
, data):
self
.data
=
data
self
.
next
=
None
def
getLoopstart(loop_node,head):
ptr1
=
loop_node
ptr2
=
loop_node
k
=
1
i
=
0
while
(ptr1.
next
!
=
ptr2):
ptr1
=
ptr1.
next
k
=
k
+
1
ptr1
=
head
ptr2
=
head
i
=
0
while
(i < k):
ptr2
=
ptr2.
next
i
=
i
+
1
while
(ptr2 !
=
ptr1):
ptr1
=
ptr1.
next
ptr2
=
ptr2.
next
return
ptr1
def
detectAndgetLoopstarting(head):
slow_p
=
head
fast_p
=
head
loop_start
=
None
while
(slow_p !
=
None
and
fast_p !
=
None
and
fast_p.
next
!
=
None
):
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
def
isPalindromeUtil(head, loop_start):
ptr
=
head
s
=
[]
count
=
0
while
(ptr !
=
loop_start
or
count !
=
1
):
s.append(ptr.data)
if
(ptr
=
=
loop_start) :
count
=
1
ptr
=
ptr.
next
ptr
=
head
count
=
0
while
(ptr !
=
loop_start
or
count !
=
1
):
if
(ptr.data
=
=
s[
-
1
]):
s.pop()
else
:
return
False
if
(ptr
=
=
loop_start) :
count
=
1
ptr
=
ptr.
next
return
True
def
isPalindrome(head):
loop_start
=
detectAndgetLoopstarting(head)
return
isPalindromeUtil(head,
loop_start)
def
newNode(key):
temp
=
Node(
0
)
temp.data
=
key
temp.
next
=
None
return
temp
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
):
print
(
"Palindrome"
)
else
:
print
(
"Not Palindrome"
)