数据结构与算法之链表 链表回文边界 空间 O (1) 算法实现

数据结构与算法阿木 发布于 17 天前 2 次阅读


链表回文边界(空间 O(1) 算法实现)

链表是数据结构中的一种,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表具有插入和删除操作方便、内存使用灵活等优点。在处理链表问题时,回文链表是一个常见的场景,即链表从前往后读和从后往前读都相同。本文将围绕链表回文边界这一主题,探讨如何使用空间复杂度为 O(1) 的算法来判断链表是否为回文。

链表回文边界问题分析

问题定义

给定一个链表的头节点 head,判断该链表是否为回文链表。

输入输出

- 输入:链表的头节点 head

- 输出:布尔值,表示链表是否为回文

算法要求

- 时间复杂度:O(n),其中 n 为链表长度

- 空间复杂度:O(1)

算法思路

为了实现空间复杂度为 O(1) 的算法,我们可以采用以下步骤:

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

测试代码


def create_list(nums):


if not nums:


return None


head = ListNode(nums[0])


curr = head


for num in nums[1:]:


curr.next = ListNode(num)


curr = curr.next


return head

def print_list(head):


while head:


print(head.val, end=' ')


head = head.next


print()

创建链表


nums = [1, 2, 3, 2, 1]


head = create_list(nums)


print_list(head) 输出:1 2 3 2 1

判断链表是否为回文


print(is_palindrome(head)) 输出:True


算法分析

时间复杂度

- 找到链表的中点:O(n/2) = O(n)

- 反转后半部分链表:O(n/2) = O(n)

- 比较前半部分和反转后的后半部分:O(n/2) = O(n)

- 总时间复杂度:O(n)

空间复杂度

- 使用了额外的指针和变量,空间复杂度为 O(1)

总结

本文介绍了如何使用空间复杂度为 O(1) 的算法来判断链表是否为回文。通过找到链表的中点、反转后半部分链表、比较前半部分和反转后的后半部分,我们可以有效地判断链表是否为回文。在实际应用中,我们可以根据具体需求选择合适的算法进行优化。