206. 反转链表(力扣LeetCode)

文章目录

  • 206. 反转链表
    • 题目描述
    • 双指针
    • 递归

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

双指针

该段代码的目标是实现链表的反转。这里使用了迭代法,不断地更改当前节点的 next 指针,直到遍历完整个链表。反转过程中,需要一个额外的指针 tmp 来保存下一个节点的信息,以防止链表断裂。

  • ListNode* cur = head; 初始化当前节点指针 cur,开始时指向链表头 head。
  • ListNode* pre = nullptr; 初始化前一个节点指针 pre,开始时没有前一个节点,因此设置为 nullptr。
  • 在 while(cur) 循环中,只要当前节点不是 nullptr(即没有到达链表尾部),循环就继续。
  • ListNode* tmp = cur->next; 保存当前节点 cur 的下一个节点,因为 cur 的 next 指针即将改变。
  • cur->next = pre; 反转操作,让当前节点 cur 的 next 指针指向前一个节点 pre。
  • pre = cur; 和 cur = tmp; 更新 pre 和 cur 指针,为下一次迭代移动到下一个节点。
    循环结束时,pre 指向最后一个处理的节点,这时 pre 就是反转后链表的新头节点,因此函数最后返回 pre。
class Solution {
public:
    // 反转链表的函数
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;  // cur指针用于遍历链表,初始指向头节点
        ListNode* pre = nullptr;  // pre指针用于追踪cur的前一个节点,初始为nullptr

        // 遍历链表直到cur指针为空,即到达链表末尾
        while(cur) {
            // tmp暂存cur的下一个节点,因为接下来要改变cur->next的指向
            ListNode* tmp = cur->next;

            // 反转cur指针的指向,将cur的next指向pre
            cur->next = pre;

            // 移动pre和cur指针,为下一次迭代做准备
            pre = cur;  // pre向前移动到cur的位置
            cur = tmp;  // cur向前移动到原来cur的下一个节点
        }

        // 当循环结束时,cur为nullptr,pre指向原链表的最后一个节点,即反转后的链表头
        return pre;
    }
};

递归

在这个代码中,reverseList 是一个公有方法,它为用户提供了反转链表的接口。它依赖于一个私有递归辅助函数 reverse 来实际执行反转操作。递归辅助函数 reverse 接受两个参数:当前要处理的节点 cur 和前一个节点 pre。通过不断地将 cur->next 指向 pre 并递归调用 reverse,链表被逐个节点反转,直到 cur 为 nullptr,意味着链表已经完全反转,此时 pre 是新链表的头节点。

// 解决方案类,包含反转链表的方法
class Solution {
public:
    // 公有方法,接口,它接受一个链表的头节点,并返回反转后的链表的头节点
    ListNode* reverseList(ListNode* head) {
        // 调用私有的递归函数来执行实际的反转操作
        // 初始调用时,先前节点设置为nullptr,因为头节点没有前驱
        return reverse(head, nullptr);
    }

private:
    // 私有递归函数,用于实际执行反转过程
    // 参数cur是当前正在访问的节点
    // 参数pre是cur节点之前的节点,即在反转后,cur应该指向的节点
    ListNode* reverse(ListNode* cur, ListNode* pre) {
        // 如果当前节点为空(nullptr),意味着我们到达了原始链表的尾端
        // 此时,pre是反转链表的头节点,应返回它
        if (cur == nullptr) return pre;

        // 保存当前节点的下一个节点,因为接下来需要改变当前节点的next指针
        ListNode* tmp = cur->next;
        // 反转操作:将当前节点的next指针指向pre节点
        cur->next = pre;
        // 递归调用reverse函数处理剩余的链表部分
        // 此时,当前节点成为下一步的pre,而tmp(原cur->next)成为下一步的cur
        return reverse(tmp, cur);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GUN/Linux时间同步服务之chrony配置管理

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;相关配置操作是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

嵌入式——直接存储器存取(DMA)补充

目录 一、认识 DMA 二、DMA结构 1. DMA请求 2. 通道DMA 补&#xff1a;通道配置过程。 3. 仲裁器 三、DMA数据配置 1. 从哪里来&#xff0c;到哪里去 &#xff08;1&#xff09;从外设到存储器 &#xff08;2&#xff09;从存储器到外设 &#xff08;3&#xff09;从…

【Python基础017】Python中如何进行异常判断(try...except...的使用)

1、异常判断 在python程序在运行的过程中可能会出现很多错误&#xff0c;比如语法、未定义变量、分母为0等错误&#xff1b;而我们通常使用try...except...语句来处理程序在运行中出现的这些异常&#xff0c;并显示出现错误的原因。此外&#xff0c;我们还可以用try...finally.…

全角色服务、全场景支撑、全业务应用的新一代智慧教室

新一代智慧教室以“数智化助力高质量人才培养”为核心目标&#xff0c;以AI赋能的智能硬件为基础构建多形态智慧教学环境&#xff0c;以中台为支撑实现数据、设备、系统、业务的互联互通、开放共享&#xff0c;以平台全面覆盖教学应用&#xff0c;采集、汇聚、挖掘、分析课前课…

AP5216 平均电流型LED降压恒流驱动IC 手电筒汽车摩托车灯芯片

产品描述 AP5216 是一款 PWM工作模式, 高效率、外围简单、内置功率管&#xff0c;适用于5V&#xff5e;100V输入的高精度降压 LED 恒流驱动芯片。输出最大功率可达9W&#xff0c;最大电流 1.0A。AP5216 可实现全亮/半亮功能切换&#xff0c;通过MODE 切换&#xff1a;全亮/半亮…

Pytorch线性代数

1、加法运算 A torch.arange(20, dtypetorch.float32).reshape(5, 4) B A.clone() # 通过分配新内存&#xff0c;将A的一个副本分配给B A, A B# tensor([[ 0., 1., 2., 3.], # [ 4., 5., 6., 7.], # [ 8., 9., 10., 11.], # [12., 13.,…

《幻兽帕鲁》多人联机教程:个人电脑搭建可远程访问服务器

《幻兽帕鲁》支持自建服务器实现多人联机&#xff0c;相比邀请码方式联机&#xff0c;自建服务器可突破4人限制&#xff0c;最多让32人同时游戏&#xff0c;而且如果在国内网络环境搭建服务器&#xff0c;在也可以避免官服网络原因导致的掉线、连接失败等问题。 搭建《幻兽帕鲁…

统一异常处理

统一异常处理 统一异常处理创建一个类定义方法ControllerAdvice和ExceptionHandler注意事项 统一异常处理 创建一个类 首先,我们来创建一个类,名字随意,这里我们取名ERHandler 定义方法 在ERHandler中,我们可以定义几个类,参数用来接收各种异常,这里的异常可以是任意的,返回…

从自卑到幸福:吴哲轩的成长故事

从自卑到幸福&#xff1a;吴哲轩的成长故事 吴哲轩&#xff0c;一个内向、孤独的青年&#xff0c;在中学时期以优异的成绩赢得了父母的骄傲。然而&#xff0c;他的内心却充满了迷茫和自卑。他在为父母的期望而活&#xff0c;忽视了自己的精神追求和个人成长。 进入大学后&…

SpringSecurity笔记

SpringSecurity 本笔记来自三更草堂&#xff1a;https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.337.search-card.all.click&#xff0c;仅供个人学习使用 简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;…

GD32F303,GD32F103中文手册

GD32F303,GD32F103中文手册 链接&#xff1a;https://pan.baidu.com/s/1-bOHMwUuhduI1GHNxT4P7A?pwdct44 提取码&#xff1a;ct44链接&#xff1a;https://pan.baidu.com/s/1-bOHMwUuhduI1GHNxT4P7A?pwdct44 提取码&#xff1a;ct44

米贸搜|Meta广告中级水准:Facebook自动完成四项广告设置,改善投放成效!

广告投放中的机器学习预算自动分配版位自动分配受众自动分配创意灵活调整 一、广告投放中的机器学习 机器学习现已成为数字营销的基础&#xff0c;能够帮助我们面向想要触达的受众投放与之相关的广告。随着我们对如何使用机器学习的了解加深&#xff0c;我们对“如何创建广告…

爸爸的爸爸的爸爸的爸爸叫什么?

效果 简介 由于工作生活节奏不同&#xff0c;如今很多关系稍疏远的亲戚之间来往并不多。因此放假回家过年时&#xff0c;往往会搞不清楚哪位亲戚应该喊什么称呼&#xff0c;很是尴尬。然而搞不清亲戚关系和亲戚称谓的不仅是小孩&#xff0c;就连年轻一代的大人也都常常模糊混乱…

C++ Qt开发:SqlTableModel映射组件应用

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍SqlTableModule组件的常用方法及灵活运用。 …

【NodeJS】004- NodeJS的模块化与包管理工具

模块化 1. 介绍 1.1.什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什么是模块化项目 ? 编码时是按照模…

Vulnhub靶场DC-9

攻击机192.168.223.128 靶机192.168.223.138 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.138 开启了22 80端口 访问一下web页面 有个查询界面 测试发现存在post型的sql注入 用sqlmap跑一下&#xff0c;因为是post型的&#xff0c;这里…

深入理解TCP网络协议

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 4.四次挥手 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08…

探索半导体制造业中的健永科技RFID读写器的应用方案

一、引言 在当今高度自动化的工业环境中&#xff0c;无线射频识别&#xff08;RFID&#xff09;技术已经成为实现高效生产的重要一环。特别是在半导体制造业中&#xff0c;由于产品的高价值和复杂性&#xff0c;生产过程的追踪和管理显得尤为重要。健永科技RFID读写器以其出色…

Nginx解析漏洞复现

首先这个漏洞不是软件或代码的问题&#xff0c;是认为疏忽造成的。 一、环境搭建 从vulhub上面下载vulhub-master.zip文件&#xff0c;上传到服务器中&#xff0c;或者直接在服务器下载。 unzip vulhub-master.zip 进入漏洞目录 cd /vulhub-master/vulhub-master/nginx/ng…

十大排序算法之非线性时间比较类排序

前言 接下来就开始我们的算法学习之路了&#xff0c;代码会分别使用Java与Python来实现&#xff0c;数据处理的算法很多&#xff0c;排序是最基础且最重要的一类&#xff0c;大多数人都是通过学习排序算法入门的。接下来让我们一起学习闻名遐迩的十大排序算法&#xff0c;它们…