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) 理解递归思维
相关推荐
小欣加油15 分钟前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-1 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新1 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化
怪兽学LLM1 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪2 小时前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法
CC数学建模2 小时前
2026年江西省研究生数学建模竞赛1题:空间数据分析中的过拟合识别完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
leo__5202 小时前
MATLAB实现牧羊人算法
开发语言·算法·matlab
Gauss松鼠会2 小时前
【GaussDB】GaussDB SMP特性调优详解
java·服务器·前端·数据库·sql·算法·gaussdb
Tisfy2 小时前
LeetCode 3689.最大子数组总值 I:What The Medium
算法·leetcode·题解·贪心·模拟·脑筋急转弯
葬送的代码人生2 小时前
JavaScript 数组完全指南:从入门到实战
前端·javascript·算法