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 小时前
每日两道力扣,day5
数据结构·c++·算法·leetcode·职场和发展·hot100
jiang_changsheng5 小时前
亚马逊的2026年最新算法变革自然流量分发机制“文本匹配”到“多模态意图理解”的范式革命
大数据·算法·推荐算法
OOJO10 小时前
c++---list介绍
c语言·开发语言·数据结构·c++·算法·list
别或许12 小时前
1、高数----函数极限与连续(知识总结)
算法
派大星~课堂12 小时前
【力扣-142. 环形链表2 ✨】Python笔记
python·leetcode·链表
田梓燊12 小时前
code 560
数据结构·算法·哈希算法
笨笨饿12 小时前
29_Z变换在工程中的实际意义
c语言·开发语言·人工智能·单片机·mcu·算法·机器人
kobesdu12 小时前
综合强度信息的激光雷达去拖尾算法解析和源码实现
算法·机器人·ros·slam·激光雷达
weixin_4130632112 小时前
记录 MeshFlow-Online-Video-Stabilization 在线稳像
算法·meshflow·实时防抖
会编程的土豆13 小时前
【数据结构与算法】动态规划
数据结构·c++·算法·leetcode·代理模式