📜  用于检查带有循环的链表是否为回文的Python程序(1)

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

用于检查带有循环的链表是否为回文的Python程序

本程序为Python编写的算法,用于检查带有循环的链表是否为回文,即正反读相同的字符串。算法时间复杂度为O(n),空间复杂度为O(1)。

算法实现

程序实现的基本思路是将链表前半部分反转,然后与后半部分比较。本程序通过快慢指针找到链表的中点,然后使用反转链表算法反转链表前半部分。最后,比较反转后的前半部分与后半部分是否相同。

反转链表算法

反转链表算法是本程序的关键,其实现基本思路是通过定义三个指针pre、cur、next来遍历整个链表,每次将cur的后继节点指向pre,然后将pre指向cur,cur指向next继续遍历链表。

反转链表算法的实现代码如下:

def reverse_list(head):
    pre = None
    cur = head
    while cur:
        next = cur.next
        cur.next = pre
        pre = cur
        cur = next
    return pre
检查回文函数

检查回文函数的实现代码如下:

def is_palindrome(head):
    # 找到链表中点
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    
    # 反转前半部分链表
    prev, cur = None, head
    while cur is not slow:
        cur.next, prev, cur = prev, cur, cur.next
    
    # 奇数个节点时,跳过链表中点节点
    if fast:
        slow = slow.next
    
    # 比较前半部分与后半部分是否相同
    while prev and prev.val == slow.val:
        prev, slow = prev.next, slow.next
    
    # 恢复初始状态
    cur = prev
    prev = None
    while cur:
        cur.next, prev, cur = prev, cur, cur.next
    
    return not prev
算法测试

我们可以使用以下代码对算法进行测试:

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

def create_linked_list(lst):
    head = ListNode(None)
    tail = head
    for val in lst:
        node = ListNode(val)
        tail.next = node
        tail = node
    return head.next

lst1 = create_linked_list([1, 2, 3, 2, 1])
lst2 = create_linked_list([1, 2, 3, 3, 2, 1])
lst3 = create_linked_list([1, 2, 3, 4, 5])

print(is_palindrome(lst1)) # True
print(is_palindrome(lst2)) # True
print(is_palindrome(lst3)) # False
总结

本程序实现了Python检查带有循环的链表是否为回文的算法,具有较高的时间复杂度和空间复杂度。程序根据链表的特点,通过快慢指针找到链表的中点,然后使用反转链表算法反转链表前半部分。最后,比较反转后的前半部分与后半部分是否相同。