📅  最后修改于: 2023-12-03 15:10:52.301000             🧑  作者: Mango
本程序用于检查给定的单链表是否为回文。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def isPalindrome(head: ListNode) -> bool:
# 找到中间节点
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 反转后半部分链表
prev = None
while slow:
temp = slow.next
slow.next = prev
prev = slow
slow = temp
# 比较前半部分和后半部分是否相等
while prev:
if prev.val != head.val:
return False
prev = prev.next
head = head.next
return True
# 构建单链表 1->2->3->2->1
test_head = ListNode(1, ListNode(2, ListNode(3, ListNode(2, ListNode(1)))))
# 检查链表是否为回文
assert isPalindrome(test_head) == True
# 构建单链表 1->2->3->4->5
test_head = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
# 检查链表是否为回文
assert isPalindrome(test_head) == False
本程序的时间复杂度为 $O(n)$,其中 $n$ 为链表的长度,因为需要遍历链表两次。空间复杂度为 $O(1)$,只需要常数个辅助变量。