链表-206. 反转链表

134 阅读3分钟

题目 206. 反转链表

算法问题 : 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 请你给出 最优解 以及解题思路还有时间空间复杂度 ,尽可能准确 详细

CHATGPT:

反转单链表是一个常见的算法问题。这个问题的最优解是使用迭代方法,它不需要额外的空间来存储链表节点,因此在时间和空间效率上都非常高。

解题思路

  1. 初始化两个指针: 使用两个指针,一个指向当前节点(current),另一个指向前一个节点(prev)。初始时,prev 设置为 null,因为反转后的链表头节点将指向 null

  2. 遍历链表: 遍历链表,对每个节点执行以下操作:

    • 保存 current.next,因为在反转链接后,我们需要知道下一个节点在哪里。
    • current 的下一个节点指向 prev,实现反转。
    • prev 移动到 current 的位置。
    • current 移动到保存的下一个节点的位置。
  3. 结束条件: 当 currentnull 时,遍历完成,此时 prev 将指向新的头节点。

Java 实现

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode current = head;
        while (current != null) {
            ListNode nextTemp = current.next;
            current.next = prev;
            prev = current;
            current = nextTemp;
        }
        return prev;
    }
}

复杂度分析

  • 时间复杂度: (O(n)),其中 (n) 是链表的长度。这是因为我们需要遍历链表中的每个节点一次。

  • 空间复杂度: (O(1))。这个算法只需要固定数量的额外空间,不管输入链表的大小。

这种方法是反转链表问题的最优解,因为它以线性时间遍历链表并且不需要额外的空间来存储链表的副本或使用递归。

YOU:我看不太明白可以生成一个动态图 帮我展示下整个过程么

CHATGPT:

创建一个动态图来展示单链表反转的过程是一个复杂的任务,超出了我的当前能力范围,因为我无法生成动态图像。不过,我可以尝试以一种更简单的方式来解释这个过程,希望这能帮助您更好地理解。

想象一下,链表是一系列节点,每个节点都指向下一个节点。反转链表的过程实际上是改变每个节点的指向,使其指向前一个节点而不是下一个节点。

初始状态:

head -> [1] -> [2] -> [3] -> null

在第一步中,我们将第一个节点(1)的指向改变为 null,并将 head 移动到下一个节点(2)。这时,链表看起来像这样:

null <- [1]   [2] -> [3] -> null
         ^      ^
       prev   head

继续这个过程,我们将节点 2 的指向改为节点 1,然后移动 headprev

null <- [1] <- [2]   [3] -> null
                ^      ^
              prev   head

重复这个过程直到 headnull。最终链表会变成:

null <- [1] <- [2] <- [3]
                          ^
                        prev

此时,prev 指向了新的链表头部(节点 3),这就是反转后的链表。

希望这个步骤的解释有助于您理解反转链表的整个过程。