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) 理解递归思维
相关推荐
小雉系统5 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨1239 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏9 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆14 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落14 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black15 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791217 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔17 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆18 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac