返回

剖析LeetCode 92:反转链表 II(Python代码实操)

后端

剖析LeetCode 92:反转链表 II

题目概述

LeetCode 92题要求我们反转一个链表中的指定部分。给你一个链表的头节点head,以及两个整数left和right,你需要反转从左指针left到右指针right的节点,返回反转后的链表头节点。

问题示例

考虑以下示例:

head = [1, 2, 3, 4, 5]
left = 2
right = 4

反转后的链表应该是:

[1, 4, 3, 2, 5]

解决方案

为了反转链表中的指定部分,我们可以采用以下步骤:

  1. 找到left节点和right节点。
  2. 分离出left节点之前的部分和right节点之后的部分。
  3. 反转left节点和right节点之间的部分。
  4. 将反转后的部分重新连接到left节点之前和right节点之后的部分。

Python代码示例

def reverseBetween(head, left, right):
    # 检查输入是否合法
    if left < 1 or right > len(head):
        return head

    # 找到left节点和right节点
    left_node = head
    for _ in range(left - 1):
        left_node = left_node.next

    right_node = head
    for _ in range(right):
        right_node = right_node.next

    # 分离出left节点之前的部分和right节点之后的部分
    prev_left_node = None
    while left_node != head:
        prev_left_node = left_node
        left_node = left_node.next

    next_right_node = right_node.next

    # 反转left节点和right节点之间的部分
    prev_node = None
    current_node = left_node
    while current_node != next_right_node:
        next_node = current_node.next
        current_node.next = prev_node
        prev_node = current_node
        current_node = next_node

    # 将反转后的部分重新连接到left节点之前和right节点之后的部分
    if prev_left_node:
        prev_left_node.next = right_node
    else:
        head = right_node

    left_node.next = next_right_node

    return head

复杂度分析

  • 时间复杂度:反转链表的复杂度为O(n),其中n是链表的长度。
  • 空间复杂度:由于不需要额外空间,因此空间复杂度为O(1)。

结语

掌握链表反转的技巧对于解决LeetCode 92题非常有帮助。通过本文的详细讲解和Python代码示例,相信你已经对链表反转有了更深刻的理解。如果你有任何疑问或需要进一步的帮助,请随时提出。