Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
Subscribe to see which companies asked this question
两种方法,注释掉的比较流氓,把链表的东西拿出来放进list里,然后翻转比较
第二种方法比较正常,而且也满足O(1)的空间条件,设置一快一慢两个pointer,快的走到头的时候,慢的正好在中间
慢的每走一步,都进行一次链表翻转。
然后逐个节点比较
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def isPalindrome(self, head):
if head == None or head.next == None :
return True
h = head
fast = head
slow = head
prv = None
temp = None
while fast and fast.next:
fast = fast.next.next
temp = slow.next
slow.next = prv
prv = slow
slow = temp
slow = prv
if fast:
temp = temp.next
'''
while temp:
print temp.val
temp = temp.next
print '----'
while slow:
print slow.val
slow = slow.next
'''
while temp and slow:
#print temp.val
if temp.val != slow.val:
return False
temp = temp.next
slow = slow.next
return True
'''
q = []
h = head
while h :
q.append(h.val)
h = h.next
qq = q[:]
qq.reverse()
return q == qq
'''
"""
:type head: ListNode
:rtype: bool
"""