📌  相关文章
📜  检查单链表是否为回文的Python程序(1)

📅  最后修改于: 2023-12-03 15:10:52.301000             🧑  作者: Mango

检查单链表是否为回文的Python程序

本程序用于检查给定的单链表是否为回文。

算法思路
  1. 找到中间节点
  2. 反转后半部分链表
  3. 比较前半部分和后半部分是否相等
程序代码
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)$,只需要常数个辅助变量。