📜  检查单向链表是否为回文的函数(1)

📅  最后修改于: 2023-12-03 14:55:44.792000             🧑  作者: Mango

检查单向链表是否为回文的函数

介绍

本文介绍了如何编写一个函数来检查一个单向链表是否为回文。回文是指正着读和倒着读都一样的字符串或序列。在链表中,我们需要检查链表的节点值是否以正序和逆序相同的方式排列。

思路

我们可以通过将链表的值复制到一个数组中,然后利用数组的特性来判断是否为回文。具体步骤如下:

  1. 创建一个数组,并将链表的值复制到数组中。
  2. 使用双指针法,一个指针从数组的开头出发,一个指针从数组的结尾出发。
  3. 比较两个指针所指向的值是否相同,如果不相同,则链表不是回文。
  4. 移动指针,继续比较直到两个指针相遇。
代码示例
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def isPalindrome(head):
    # 将链表的值复制到数组中
    values = []
    curr = head
    while curr:
        values.append(curr.val)
        curr = curr.next
    
    # 使用双指针法判断是否为回文
    left, right = 0, len(values) - 1
    while left < right:
        if values[left] != values[right]:
            return False
        left += 1
        right -= 1
    
    return True
复杂度分析
  • 时间复杂度:遍历链表需要O(n)的时间,复制链表值到数组需要O(n)的时间,使用双指针法需要O(n/2)的时间。因此,总的时间复杂度为O(n)。
  • 空间复杂度:由于需要使用一个数组来存储链表的值,因此空间复杂度为O(n),其中n表示链表的长度。
总结

本文介绍了检查单向链表是否为回文的函数,并给出了具体的思路和代码实现。此方法利用数组来简化回文的判断,通过双指针法来比较数组中对称位置的值。这是一个简单有效的方法,但需要额外的O(n)空间来存储链表的值。如果没有空间复杂度的限制,这个方法是可行的。