LeetCode Hot100(19/100)——206. 反转链表

文章目录

    • 一、题目描述
    • 二、问题本质与考察点
    • 三、思维导图
    • 四、迭代解法(Iterative Approach)
        1. 原理说明
        1. 流程图示意
        1. Java 实现代码
        1. 时间与空间复杂度分析
    • 五、递归解法(Recursive Approach)
        1. 原理说明
        1. 时序图说明递归流程
        1. Java 实现代码
        1. 时间与空间复杂度分析
    • 六、两种解法对比总结

一、题目描述

给定一个单链表的头节点 head,请将该链表反转,并返回反转后的链表头节点。

示例:

输入:head = [1, 2, 3, 4, 5]

输出:[5, 4, 3, 2, 1]


二、问题本质与考察点

这道题是链表操作的入门题,核心考察的是:

  1. 对链表节点指针的操作理解;
  2. 指针反转逻辑;
  3. 如何用迭代或递归的思维去解决。

三、思维导图

下面是本题的知识结构与思路概览:
反转链表
原理
数据结构:单链表
核心操作:指针翻转
解法类型
迭代法
递归法
分析
n
空间复杂度 O(1) 或 O(n)(递归)
关键难点
指针变化过程理解


四、迭代解法(Iterative Approach)

1. 原理说明

迭代法的思路非常直观:

从链表的头节点开始,逐节点反转它们的 next 指针方向,直到链表末尾。

要使用三个指针变量:

  • prev:指向当前节点的前一个节点(初始为 null
  • cur:指向当前遍历的节点
  • next:保存当前节点的下一个节点

每一步操作如下:

  1. 保存下一个节点:next = cur.next
  2. 反转指针方向:cur.next = prev
  3. 前移指针:prev = cur
  4. cur 指向下一个节点:cur = next

直到 cur 为空,此时 prev 即为反转后的链表新头节点。


2. 流程图示意



开始
初始化 prev = null, cur = head
cur != null?
保存 next = cur.next
反转 cur.next = prev
移动 prev = cur
移动 cur = next
返回 prev
结束


3. Java 实现代码

java 复制代码
public class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        return prev;
    }
}

4. 时间与空间复杂度分析

  • 时间复杂度:O(n),其中 n 为链表节点数,每个节点只遍历一次。
  • 空间复杂度:O(1),使用常量级辅助变量,不占额外空间。

五、递归解法(Recursive Approach)

1. 原理说明

递归法的思想是:

  • 将当前节点之后的链表反转;
  • 把当前节点接到反转后的尾部。

递归的关键在于: 反转子链表后,调整指针方向。

假设 head 指向链表头,调用 reverseList(head.next) 得到反转后的子链表 newHead

再将当前节点 head 接在子链表尾部:

java 复制代码
head.next.next = head;
head.next = null;

最后返回 newHead 即可。


2. 时序图说明递归流程

reverseList Main reverseList Main 调用 reverseList(head) 递归到链表末尾 返回反转后的 newHead 调整当前节点指针方向 返回新的头节点


3. Java 实现代码

java 复制代码
public class Solution {
    public ListNode reverseList(ListNode head) {
        // 递归终止条件:空链或单节点
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}

4. 时间与空间复杂度分析

  • 时间复杂度:O(n),每个节点访问一次。
  • 空间复杂度:O(n),递归调用栈深度为链表长度。

六、两种解法对比总结

解法方式 思路特点 时间复杂度 空间复杂度 适用场景
迭代法 指针循环反转,逻辑清晰且高效 O(n) O(1) 推荐做法
递归法 利用函数栈反转链表,更简洁但占栈空间 O(n) O(n) 理解递归思维
相关推荐
m0_715575342 小时前
分布式任务调度系统
开发语言·c++·算法
naruto_lnq2 小时前
泛型编程与STL设计思想
开发语言·c++·算法
踩坑记录2 小时前
leetcode hot100 94. 二叉树的中序遍历 easy 递归 dfs
leetcode
zxsz_com_cn2 小时前
设备预测性维护算法分类及优劣势分析,选型指南来了
算法·分类·数据挖掘
m0_748708053 小时前
C++中的观察者模式实战
开发语言·c++·算法
然哥依旧3 小时前
【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)
算法·支持向量机·matlab·cnn
qq_537562673 小时前
跨语言调用C++接口
开发语言·c++·算法
Tingjct3 小时前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法