数据结构与算法之 leetcode 链表回文判断算法 快慢指针 + 反转

数据结构与算法阿木 发布于 2025-07-12 8 次阅读


链表回文判断算法:快慢指针与反转的巧妙运用

在数据结构与算法的学习过程中,链表是一种非常重要的数据结构。链表具有灵活的插入和删除操作,但在某些情况下,链表也会带来一些挑战,比如判断链表是否为回文。本文将围绕这一主题,探讨使用快慢指针和反转链表的方法来判断链表是否为回文。

链表回文判断问题

回文是一个序列,从前往后读和从后往前读都一样。例如,"12321" 和 "abccba" 都是回文。对于链表来说,判断其是否为回文,就是要检查链表的前半部分和后半部分是否完全相同。

快慢指针法

快慢指针法是一种常用的算法技巧,用于解决链表中的许多问题。在判断链表是否为回文的问题中,我们可以使用快慢指针来找到链表的中点,然后反转后半部分链表,最后比较前半部分和反转后的后半部分是否相同。

步骤分析

1. 使用快慢指针找到链表的中点。

2. 反转链表的后半部分。

3. 比较前半部分和反转后的后半部分是否相同。

4. 恢复链表(可选)。

代码实现

python

class ListNode:


def __init__(self, val=0, next=None):


self.val = val


self.next = next

def is_palindrome(head):


if not head or not head.next:


return True

使用快慢指针找到中点


slow, fast = head, head


while fast and fast.next:


slow = slow.next


fast = fast.next.next

反转后半部分链表


prev, curr = None, slow


while curr:


next_node = curr.next


curr.next = prev


prev = curr


curr = next_node

比较前半部分和反转后的后半部分


left, right = head, prev


while right:


if left.val != right.val:


return False


left = left.next


right = right.next

return True


反转链表法

除了快慢指针法,我们还可以直接反转整个链表,然后比较反转后的链表是否与原链表相同。这种方法虽然简单,但需要额外的空间来存储反转后的链表。

步骤分析

1. 反转整个链表。

2. 比较反转后的链表与原链表是否相同。

3. 恢复链表(可选)。

代码实现

python

def is_palindrome(head):


if not head or not head.next:


return True

反转整个链表


prev, curr = None, head


while curr:


next_node = curr.next


curr.next = prev


prev = curr


curr = next_node

比较反转后的链表与原链表


left, right = head, prev


while right:


if left.val != right.val:


return False


left = left.next


right = right.next

return True


总结

本文介绍了两种判断链表是否为回文的算法:快慢指针法和反转链表法。快慢指针法在空间复杂度上更优,因为它不需要额外的空间来存储反转后的链表。而反转链表法虽然简单,但需要额外的空间。在实际应用中,可以根据具体需求选择合适的算法。

扩展

1. 如何在O(1)空间复杂度内判断链表是否为回文?

2. 如何在O(1)空间复杂度内判断链表是否为回文,并且不需要恢复链表?

3. 如何判断一个字符串是否为回文?

这些问题都可以通过类似的方法来解决,但需要根据具体问题进行适当的调整。希望本文能帮助你更好地理解链表回文判断算法。