题目描述:给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
做的时候易错的核心问题:
1.用的快慢指针,slow每次前进一步,就将slow前的结点插入到以pre为头指针的链表的每一个结点之前,也就是反转。
2.奇数个时fast指针总会停在最后一个结点,与此同时slow指针就刚好在链表最中间的结点,此节点不需要判断,于是需要将slow向后再移动一位。
3.pre作为反转链表的第一个指针,slow作为原链表的第一个指针进行依次比较
4.应该经过while判断之后再pre = slow,如果把pre=slow写在最末尾,那么就成了先移动再判断,根据上面第三点就会发生本应该退出while循环了,pre却指向了slow,若一定要先移动再比较,可以将下面比较值的代码中的pre改成prev,则同样能提交
class ListLink:
def __init__(self,val):
self.val = val
self.next = None
class LinkNode:
def __init__(self):
self.head = None
def init_List(self,data):
self.head = ListLink(data[0])
p = self.head
r = self.head
for i in data[1:]:
node = ListLink(i)
p.next = node
p = p.next
return r
class Solution:
def isPalindrome(self,head):
if not head or not head.next:
return True
fast = head
slow = head
pre = head
prev = None
while fast and fast.next:
pre = slow
slow = slow.next
fast = fast.next.next
pre.next = prev
prev = pre
#如果是奇数
if fast:
slow = slow.next
while slow and pre:
if slow.val != pre.val:
return False
slow = slow.next
pre = pre.next
return True
if __name__ == "__main__":
solu_isPalin_instance = Solution()
l_instance = LinkNode()
data =[1,2,2,1]
link = l_instance.init_List(data)
a = solu_isPalin_instance.isPalindrome(link)
print(a)