链表回文边界(空间 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) 的算法来判断链表是否为回文。通过找到链表的中点、反转后半部分链表、比较前半部分和反转后的后半部分,我们可以有效地判断链表是否为回文。在实际应用中,我们可以根据具体需求选择合适的算法进行优化。
Comments NOTHING