看了官方解题思路,然后自己写的代码。
1、找到链表的中间结点,此时slow指向奇数链的中间结点,偶数链的中间的右边结点
2、翻转后边的链表,此时slow指向第二部分子链翻转后的头结点
3、对比head和slow指向的链表即可
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if not head or not head.next: # 空链、一个结点的链
return True
# 1、找到链表的中间结点
slow = head
fast = head.next
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# slow指向奇数链的中间结点,偶数链的中间的右边结点
# 2、翻转后边的链表
# 2.1 再写一次反转,但是写的不精简T^T
# pre = slow.next.next
# cur = slow.next
# slow.next = None
# while True:
# cur.next = slow
# slow = cur
# cur = pre
# if not cur:
# break
# pre = pre.next
# 2.2 之前的代码
pre = None
while cur:
nextnode = slow.next
slow.next = pre
pre = slow
slow = nextnode
# slow指向第二部分子链翻转后的头结点
# 3、对比
firstpart = head
while slow and firstpart: #奇数链的情况下,最后的slow指向了None,此时firstpart指向slow
print('slow:',slow.val,'firstpart:',firstpart.val)
if firstpart.val != slow.val:
return False
firstpart = firstpart.next
slow = slow.next
return True