如何使用Python实现链表的回文判断

2023-04-11 00:00:00 链表 如何使用 回文

链表是由节点组成的数据结构,每个节点包含一个数据元素和一个指向下一个节点的指针。回文指的是正向和反向读取是同样的。

在Python中,可以使用类来实现链表。每个节点作为一个对象,包含两个属性:数据元素和指向下一个节点的指针。在判断回文时,可以使用双指针法,一个指针从链表头开始遍历,另一个指针从链表尾开始遍历。如果遍历过程中两个指针所指的节点数据元素不相等,则该链表不是回文,否则是回文。

下面是链表回文判断的Python代码演示:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

def isPalindrome(head):
    slow = head
    fast = head

    # find the midpoint of the linked list
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

    # reverse the second half of the linked list
    prev = None
    current = slow

    while current:
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node

    # compare the first and second half of the linked list
    p1 = head
    p2 = prev

    while p2:
        if p1.data != p2.data:
            return False
        p1 = p1.next
        p2 = p2.next

    return True

# create a linked list
head = Node('p')
head.next = Node('i')
head.next.next = Node('d')
head.next.next.next = Node('a')
head.next.next.next.next = Node('n')
head.next.next.next.next.next = Node('c')
head.next.next.next.next.next.next = Node('o')
head.next.next.next.next.next.next.next = Node('d')
head.next.next.next.next.next.next.next.next = Node('e')
head.next.next.next.next.next.next.next.next.next = Node('.com')

# test if the linked list is palindrome
print(isPalindrome(head))  # True

在上面的代码中,我们首先定义了一个Node类,表示节点对象。然后,定义了isPalindrome函数,表示链表回文判断。该函数接收一个链表头节点作为参数。

在函数中,我们首先使用快慢指针法,找到链表的中点。然后,反转链表的后半部分。最后,比较链表的前半部分和反转后的后半部分是否相等。如果相等,则链表是回文,返回True,否则返回False

在代码的最后,我们创建了一个链表对象,并测试了该链表是否是回文。输出结果为True,表示该链表是回文。

注意:该代码只是一种实现方式,可能不是最优的。在实际应用中,需要根据具体的需求和数据结构特点来选择合适的算法实现。

相关文章