返回

反转链表内指定区间

前端

在数据结构中,链表是一种常见且用途广泛的数据结构,它由一系列节点组成,每个节点包含一个值和指向下一个节点的指针。反转链表是一个经典的操作,涉及改变链表节点的顺序。在本文中,我们将探究如何在链表的指定区间内执行此操作。

问题

给定一个单链表的头指针 head 和两个整数 leftright,其中 left 小于或等于 right。我们的目标是反转链表中从第 left 个节点到第 right 个节点的区间。

算法步骤

为了在指定区间内反转链表,我们可以采用以下步骤:

  1. 找到反转区间的头节点和尾节点: 遍历链表,找到位置为 left 的节点(头节点)和位置为 right 的节点(尾节点)。
  2. 断开反转区间: 将头节点的前驱节点和尾节点的后继节点断开,以隔离反转区间。
  3. 反转区间: 使用双指针技术,反转从头节点到尾节点的区间内的节点顺序。
  4. 重新连接反转区间: 将反转后的区间重新连接到链表中,将头节点连接到尾节点的后继节点,将尾节点连接到头节点的前驱节点。

代码实现

以下是使用 Python 实现的算法代码:

def reverse_linked_list_range(head, left, right):
    """
    反转链表内指定区间。

    Args:
        head: 链表的头指针。
        left: 反转区间的左边界。
        right: 反转区间的右边界。

    Returns:
        反转后的链表的头指针。
    """

    # 边界检查
    if left < 1 or left > right:
        return head

    # 找到反转区间的头节点和尾节点
    left_node = head
    for _ in range(1, left):
        left_node = left_node.next
    right_node = head
    for _ in range(1, right):
        right_node = right_node.next

    # 断开反转区间
    left_node.prev.next = right_node.next
    right_node.next.prev = left_node.prev

    # 反转区间
    prev = None
    current = left_node
    while current != right_node.next:
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node

    # 重新连接反转区间
    left_node.prev = right_node
    right_node.next = left_node

    return head

时间复杂度

该算法的时间复杂度为 O(n),其中 n 为链表的长度。找到反转区间的头节点和尾节点需要 O(n) 时间,反转区间需要 O(n) 时间,重新连接反转区间需要 O(1) 时间。