题目:
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?
解法:
class Solution(object):
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head or not head.next:
return True
#计算链表长度(更好的办法是用快慢指针),为了找中点
count = head
lenth = 0
while(count != None):
lenth += 1
count = count.next
#中点前的元素个数,以及原链表的奇偶性
num = lenth//2
judge = lenth%2
#前一半链表反转
inversehead = head
index = head.next
inversehead.next = None
for i in range(1, num):
tmp = index.next
index.next = inversehead
inversehead = index
index = tmp
#根据奇偶性不同进行比较
if judge == 0:
while(inversehead != None and index != None):
if inversehead.val != index.val:
return False
inversehead = inversehead.next
index = index.next
return True
else:
index = index.next
while(inversehead != None and index != None):
if inversehead.val != index.val:
return False
inversehead = inversehead.next
index = index.next
return True