如何使用Python实现链表的回文判断
链表是由节点组成的数据结构,每个节点包含一个数据元素和一个指向下一个节点的指针。回文指的是正向和反向读取是同样的。
在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
,表示该链表是回文。
注意:该代码只是一种实现方式,可能不是最优的。在实际应用中,需要根据具体的需求和数据结构特点来选择合适的算法实现。
相关文章