当前位置: 首页 > article >正文

LeetCode Hot100刷题——反转链表(迭代+递归)

206.反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

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

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

反转链表通常有两种方法:迭代法和递归法。

迭代法(双指针)

        假设原来的链表是1->2->3->4->5->null,反转后变成null<-1<-2<-3<-4<-5。那在迭代的时候,初始状态应该是prev=null,current=head。然后循环处理每个节点:                        

        在循环中,首先保存当前节点的下一个节点nextTemp,然后把当前节点的next指向prev。接着prev移动到current的位置,current移动到nextTemp的位置。直到current为null,此时prev就是新的头节点。

实现代码:

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {ListNode current = head;ListNode prev = null;while (current != null) {ListNode nextTemp = current.next; // 保存下一个节点current.next = prev; /// 反转指针prev = current; // 前移prevcurrent = nextTemp; // 前移current}return prev; // prev即为新链表的头结点}
}

步骤解释:

  1. 初始化指针:使用两个指针prevcurrent,初始时prevnullcurrent指向头节点head

  2. 遍历链表:在current不为null时循环处理每个节点。

    • 保存下一个节点:临时存储current.nextnextTemp,防止反转指针后丢失后续节点。

    • 反转指针:将当前节点currentnext指向prev,完成当前节点的反转。

    • 移动指针:将prev移动到当前current的位置,current移动到之前保存的nextTemp位置。

  3. 返回新头节点:当循环结束时,currentnullprev指向原链表的最后一个节点,即反转后的新头节点。

递归法

递归方法的步骤如下:

  1. 递归终止条件:当前节点为空或下一个子节点为空,返回当前节点
  2. 递归反转后续链表,得到反转后的头结点
  3. 将当前节点的下一个节点的next指向当前节点,形成反转
  4. 将当前节点的next设为null,断开原来的连接
  5. 返回反转后的头结点

实现代码

class Solution {public ListNode reverseList(ListNode head) {// 递归法// 递归终止条件,空链表或单链表无需反转if (head == null || head.next == null) {return head;}// 递归反转后续链表,得到新头结点ListNode newHead = reverseList(head.next);// 调整指针方向,将当前节点的下一个节点的next指向自己head.next.next = head;// 断开当前节点的原指向,防止循环head.next = null;// 返回新头结点return newHead;}
}

示例分析

1. 递归调用栈展开

递归从头部节点 1 开始,逐层深入,直到链表末尾的节点 5。以下是调用栈的展开过程:

reverseList(1) → reverseList(2) → reverseList(3) → reverseList(4) → reverseList(5)

终止条件触发:当调用 reverseList(5) 时,5.next == null,直接返回 5(此时 newHead = 5)。

2. 递归回溯与指针调整

递归开始逐层回溯,每层处理当前节点并调整指针方向:

层 4(head = 4

  • 输入链表状态4 → 5

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针4.next.next = 4 → 5.next = 4(形成 5 → 4)。

    3. 断开原链4.next = null(防止 4 → 5 循环)。

  • 输出链表状态5 → 4 → null

  • 返回newHead = 5

层 3(head = 3

  • 输入链表状态3 → 4 → null(原链未修改时,3.next 仍指向 4)。

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针3.next.next = 3 → 4.next = 3(形成 5 → 4 → 3)。

    3. 断开原链3.next = null

  • 输出链表状态5 → 4 → 3 → null

  • 返回newHead = 5

层 2(head = 2

  • 输入链表状态2 → 3 → null(原链未修改时,2.next 指向 3)。

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针2.next.next = 2 → 3.next = 2(形成 5 → 4 → 3 → 2)。

    3. 断开原链2.next = null

  • 输出链表状态5 → 4 → 3 → 2 → null

  • 返回newHead = 5

层 1(head = 1

  • 输入链表状态1 → 2 → null(原链未修改时,1.next 指向 2)。

  • 操作步骤

    1. 收到下层返回的 newHead = 5

    2. 调整指针1.next.next = 1 → 2.next = 1(形成 5 → 4 → 3 → 2 → 1)。

    3. 断开原链1.next = null

  • 输出链表状态5 → 4 → 3 → 2 → 1 → null

  • 返回newHead = 5

总结

  1. 递归终止条件:处理到链表末尾时直接返回。

  2. 递归分解问题:假设后续链表已反转,只需调整当前节点和下一个节点的指针。

  3. 指针操作:通过 head.next.next = head 和 head.next = null 完成局部反转并断开原链。

相关文章:

LeetCode Hot100刷题——反转链表(迭代+递归)

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#…...

MCU-缓存Cache与CPU中的主存SRAM

缓存&#xff08;Cache&#xff09;和主存&#xff08;SRAM&#xff09;均属于 ​SRAM&#xff0c;他们的核心区别&#xff1a; 通过 Cache 缓存 Flash 中的指令和数据&#xff0c;可避免 CPU 因等待数据而停滞。主存 SRAM 存储程序运行时的变量、堆栈、临时数据等。通常作为 …...

在Windows 11的WSL中安装Kali Linux

Kali Linux 是网络安全从业者和爱好者的首选工具集&#xff0c;但直接在物理机或虚拟机上运行可能占用较多资源。借助 Windows Subsystem for Linux (WSL)&#xff0c;我们可以在Windows 11中原生运行Kali Linux&#xff0c;轻量且高效。本教程将手把手教你如何在WSL2中安装并配…...

Manus AI Agent 技术解读:架构、机制与竞品对比

目录 1. Manus 是什么&#xff1f; 1.1 研发背景 1.2 技术特点 1.3 工具调用能力 1.4 主要应用场景 2. Manus 一夜爆火的原因何在&#xff1f; 2.1 技术突破带来的震撼 2.2 完整交付的产品体验 2.3 生态与开源策略 3. Manus 与其他 AI Agent 的对比分析 3.1 技术架构…...

010---基于Verilog HDL的分频器设计

文章目录 摘要一、时序图二、程序设计2.1 rtl2.2 tb 三、仿真分析四、实用性 摘要 文章为学习记录。绘制时序图&#xff0c;编码。通过修改分频值参数&#xff0c;实现任意整数分频器设计。 一、时序图 二、程序设计 2.1 rtl module divider #(parameter DIV_VALUE 5) (…...

Python贝壳网二手小区数据爬取(2025年3月更)

文章目录 一、代码整体架构解析二、各部分代码详解1. main()主函数解析2. 会话初始化&#xff08;伪装浏览器身份&#xff09;3. 动态参数生成&#xff08;反爬虫核心机制&#xff09;4. 列表页抓取&#xff08;获取小区列表&#xff09;5. 列表页解析&#xff08;提取小区信息…...

基于SpringBoot的餐厅点餐管理系统设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

Dify使用日常:我是如何按标题级别将word中的内容转存到excel中的

先上效果图 word中的内容 转存到excel之后 实现步骤&#xff1a; 1、在dify中创建一个工作流&#xff0c;如上图 2、在开始节点增加一个支持文件上传的变量 3、添加文档提取器&#xff0c;提取上传的文件中的内容 4、添加大模型节点&#xff0c;将文档提取器提取出来的内容&…...

元脑服务器:浪潮信息引领AI基础设施的创新与发展

根据国际著名研究机构GlobalData于2月19日发布的最新报告&#xff0c;浪潮信息在全球数据中心领域的竞争力评估中表现出色&#xff0c;凭借其在算力算法、开放加速计算和液冷技术等方面的创新&#xff0c;获得了“Leader”评级。在创新、增长力与稳健性两个主要维度上&#xff…...

Linux一键美化命令行,一键安装zsh终端插件

zsh应该是很多人第一个用的Linux终端美化软件 但是其安装略微复杂&#xff0c;让人有些困扰 所以我花了两天写了一键安装脚本&#xff0c;实测运行后直接安装好 适用于Ubuntu、Debian、Red Hat、macOS等系统 直接安装好zsh 以及常用插件 autojump 跳转插件 zsh-syntax-highlig…...

【django初学者项目】

下面为你详细介绍如何创建一个简单有趣的 Django 项目——博客系统。这个项目允许用户创建、查看、编辑和删除博客文章。 步骤 1&#xff1a;环境准备 首先&#xff0c;确保你已经安装了 Python 和 pip。然后&#xff0c;创建一个虚拟环境并激活它&#xff0c;接着安装 Django…...

实验一:在Windows 10/11下配置和管理TCP/IP

目录 1.【实训目标】 2.【实训环境】 3.【实训内容】 4.【实训步骤】 1.【实训目标】 1.了解网络基本配置中包含的协议、服务、客户端。 2.了解Windows支持的网络协议及参数设置方法。 3.掌握TCP/IP协议的配置。 2.【实训环境】 硬件环境&#xff1a;每人一台计算机&a…...

使用格式工厂提取视频中的音频

选择输出格式&#xff1a;在格式工厂的左侧功能栏中&#xff0c;点击 “音频” 选项&#xff0c;会展开多种音频格式&#xff0c;根据自己的需求选择如 “MP3”“WAV”“WMA” 等作为输出格式。添加视频文件&#xff1a;点击 “添加文件” 按钮&#xff0c;在弹出的文件浏览器中…...

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…...

同为科技智能PDU在数据中心场景的应用与解决方案

数据中心当前处于一个快速发展和技术变革的特殊时期&#xff0c;全新的人工智能应用正在重塑整个世界&#xff0c;为社会带来便捷的同时&#xff0c;也为数据中心的发展带来了新的机遇和挑战。智能算例的爆发式增长&#xff0c;对数据中心提出了大算力、高性能的新需求&#xf…...

uniapp开通开屏广告后动态开启或关闭开屏广告

近期使用uniapp开发的APP有uniad的广告对接&#xff0c;并且要求会员用户不显示包含开屏广告在内的广告&#xff0c;除开屏广告外的广告都可以通过uniapp广告组件控制是否显示 因uniad的开屏广告无需代码开发&#xff0c;经过uniad客服指点可在App.vue中的onLaunch生命周期中执…...

go map的声明和使用

1.简介 map是key-value数据结构&#xff0c;右丞为字段或者关联数据。类似其他语言的集合&#xff0c;map在go中是引用类型&#xff0c;必须初始化才能使用。 2.语法 map[keytype]valuetype keytype:表示间的类型。可以是基本数据类型&#xff0c;还可以是指针、channl等。…...

《V8 引擎狂飙,Node.js 续写 JavaScript 传奇》

”你没想过也许是这个镇子对你来说太小了吗&#xff1f; 对我而言&#xff0c;这个小镇容不下我的雄心壮志。 “ 什么是 Node.js&#xff1f; Node.js是一个跨平台JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序 作用&#xff1a;使用 Node.js 编写服务器端程序…...

【Java代码审计 | 第八篇】文件操作漏洞成因及防范

未经许可&#xff0c;不得转载。 文章目录 文件操作漏洞文件读取漏洞基于 InputStream 的读取基于 FileReader 的读取 文件下载漏洞文件删除漏洞防范 文件操作漏洞 分为文件读取漏洞、文件下载漏洞与文件删除漏洞。 文件读取漏洞 在Java中&#xff0c;文件读取通常有两种常见…...

在Linux开发板中使用.NET实现音频开发

本文将以Linux开发板为基础&#xff0c;使用ALSA音频框架和C#语言&#xff0c;演示如何实现基础的音频录制与播放功能。 1. 背景 音频处理是嵌入式开发中常见的需求&#xff0c;无论是语音交互、环境监测还是多媒体应用都离不开音频模块的支持。在Linux系统中&#xff0c;ALSA…...

SQL Server核心知识总结

SQL Server核心知识总结 &#x1f3af; 本文总结了SQL Server核心知识点,每个主题都提供实际可运行的示例代码。 一、SQL Server基础精要 1. 数据库核心操作 -- 1. 创建数据库&#xff08;核心配置&#xff09; CREATE DATABASE 学生管理系统 ON PRIMARY (NAME 学生管理系统…...

基于RNN+微信小程序+Flask的古诗词生成应用

项目介绍 平台采用B/S结构&#xff0c;后端采用主流的Flask框架进行开发&#xff0c;古诗词生成采用RNN模型进行生成&#xff0c;客户端基于微信小程序开发。是集成了Web后台开发、微信小程序开发、人工智能&#xff08;RNN&#xff09;等多个领域的综合性应用&#xff0c;是课…...

基于单片机的智慧农业大棚系统(论文+源码)

1系统整体设计 经过上述的方案分析&#xff0c;采用STM32单片机为核心&#xff0c;结合串口通信模块&#xff0c;温湿度传感器&#xff0c;光照传感器&#xff0c;土壤湿度传感器&#xff0c;LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测&#xff0c;土壤…...

【AGI】智谱开源2025:一场AI技术民主化的革命正在到来

智谱开源2025&#xff1a;一场AI技术民主化的革命正在到来 引言&#xff1a;开源&#xff0c;一场技术平权的革命一、CogView4&#xff1a;中文AI生成的里程碑1. 破解汉字生成的“AI魔咒”2. 开源协议与生态赋能 二、AutoGLM&#xff1a;人机交互的范式跃迁1. 自然语言驱动的跨…...

2025-03-08 学习记录--C/C++-PTA 习题8-9 分类统计各类字符个数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h> #define MAXS 15void StringCount( …...

yolov8改进|MobileNetV4替换Backbone,轻量化!!

yolov8改进|MobileNetV4替换Backbone,轻量化!! 一级目录二级目录三级目录MobileNetV4简介论文地址核心代码将核心代码放入`ultralytics/nn/modules`中,新建MobileNetV4.py修改`tasks.py``ultralytics/utils/torch_utils.py`中yaml文件一级目录 二级目录 三级目录 各位哥哥…...

OTP单片机调试工具

大部分的OTP单片机开发流程是先用仿真器进行仿真&#xff0c;f仿真完成之后再烧录OTP单片机芯片进行验证&#xff0c;但是很多少时候会发现有一个问题&#xff0c;仿真器仿真都是OK的&#xff0c;但是一旦焊接在板上了&#xff0c;就往往发现有问题&#xff0c;因为硬件条件变化…...

二次SQL注入

原理 用户向数据库存入恶意数据&#xff0c;当数据被送进数据库的时候&#xff0c;会对存入的信息进行转义然后再储存&#xff0c;但是存进去的数据会再次被转义回来&#xff08;也就是原样不变的存进数据库里&#xff0c;只是害怕攻击者在存入数据的时候捣蛋而已&#xff09;…...

机器学习:愚者未完成的诗篇(零)

当算法在数据海洋中打捞支离破碎的韵律时&#xff0c;机器学习系统展现出的智慧如同断臂的维纳斯雕像——完美与残缺构成令人战栗的美学悖论。愚者&#xff0c;在词语的混沌中编织逻辑经纬&#xff0c;却总在即将触及诗性本质的瞬间&#xff0c;暴露出认知维度的致命裂隙。 一…...

论文阅读-秦汉时期北方边疆组织的空间互动模式与直道的定位(中国)

论文英文题目&#xff1a;A spatial interaction model of Qin-Han Dynasty organisation on the northern frontier and the location of the Zhidao highway (China) 发表于&#xff1a;journal of archaeological science&#xff0c;影响因子&#xff1a;3.030 论文主要是…...