206. 反转链表(力扣LeetCode)

news2024/12/24 10:07:04

文章目录

  • 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);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第八篇【传奇开心果系列】beeware的toga开发移动应用示例:实现消消乐安卓手机小游戏

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、初步实现四、扩展思路五、实现游戏逻辑示例代码六、实现界面设计示例代码七、实现增加关卡和难度示例代码八、实现存档和排行榜示例代码九、实现添加特殊方块和道具示例…

(五)流程控制switchcase

文章目录 switch case用法全配套break示例演示 不全配套break不怎么常规的写法常规的写法示例1演示1示例2演示2 经典成绩分类案例代码演示 switch case 相对于ifelse的嵌套&#xff0c;switch case 有点像并列的感觉 用法 switch (一定要放整数类型&#xff0c;int 型变量、c…

ubuntu 22 安装 node,npm,vue

1:安装 nodejs sudo apt update curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt update && sudo apt install -y nodejs node -v 2:安装npm sudo npm install n -g npm -v 3:安装vite npm install vite -g 4:运行vue 把项目拷贝到…

「 典型安全漏洞系列 」06.路径遍历(Path Traversal)详解

引言&#xff1a;什么是路径遍历&#xff1f;如何进行路径遍历攻击并规避常见防御&#xff1f;如何防止路径遍历漏洞。 1. 简介 路径遍历&#xff08;Path Traversal&#xff09;是一种安全漏洞&#xff0c;也被称为目录遍历或目录穿越、文件路径遍历。它发生在应用程序未正确…

Tomcat10安装报错Unknown module: java.rmi specified to --add-opens

错误原因需要根据自己的tomcat的版本查看 需要根据自己的tomcat找到对应安装的java版本(查看版本网址)https://tomcat.apache.org/whichversion.html 将电脑当中的环境变量JRE_HOME变量删除即可&#xff08;具体如下图&#xff09;

LeetCode 热题 100 | 矩阵

目录 1 73. 矩阵置零 2 54. 螺旋矩阵 3 48. 旋转图像 4 240. 搜索二维矩阵 II 菜鸟做题第二周&#xff0c;语言是 C 1 73. 矩阵置零 解题思路&#xff1a; 遍历矩阵&#xff0c;寻找等于 0 的元素&#xff0c;记录对应的行和列将被记录的行的元素全部置 0将被记录的…

redis-4 搭建redis集群

1.为什么需要redis集群&#xff1f; Redis 集群提供了高可用性、横向扩展和数据分片等功能&#xff0c;使得 Redis 能够应对大规模的数据存储和高并发访问的需求。以下是一些需要使用 Redis 集群的常见情况&#xff1a; 高可用性&#xff1a;通过在多个节点之间进行数据复制和…

网络编程1

什么是网络编程 ⽹络编程&#xff0c;指⽹络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的⽅式实现⽹络通信&#xff08;或称为⽹络数据传输&#xff09;。 当然&#xff0c;我们只要满⾜进程不同就⾏&#xff1b;所以即便是同⼀个主机&#xff0c;只要是不同进程…

【服务器Midjourney】创建部署Midjourney网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

数据结构.双链表循环链表

一、1.双链表的初始化 void InitLNode(LinkList& L)//双链表的初始化 {L (LNode*)malloc(sizeof(LNode));L->prior NULL;L->next NULL;} 2.双链表的插入 void DInsert(LNode* p,LNode*s)//在p结点后面插入s结点 {s->next p->next;s->next->prior s;…

支持向量机(SVM)详解

支持向量机&#xff08;support vector machines&#xff0c;SVM&#xff09;是一种二分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器&#xff0c;间隔最大使它有别于感知机。 1、线性可分支持向量机与硬间隔最大化 1.1、线性可分支持向量机 考虑一个二分…

数据结构篇-03:堆实现优先级队列

本文着重在于讲解用 “堆实现优先级队列” 以及优先级队列的应用&#xff0c;在本文所举的例子中&#xff0c;可能使用优先级队列来解并不是最优解法&#xff0c;但是正如我所说的&#xff1a;本文着重在于讲解“堆实现优先级队列” 堆实现优先级队列 堆的主要应用有两个&…

MySQL索引类型及数据结构【笔记】

1 索引类型 返回面试宝典 主键索引&#xff08;PRIMARY&#xff09;:数据列不允许重复&#xff0c;不允许为NULL&#xff0c;一个表只能有一个主键。 唯一索引&#xff08;UNIQUE&#xff09;:数据列不允许重复&#xff0c;允许为NULL&#xff0c;一个表允许多个列创建唯一索引…

【Go】深入理解 Go map:赋值和扩容迁移 ①

文章目录 map底层实现hmapbmap map hash冲突了怎么办&#xff1f; map扩容触发扩容时机扩容小结为什么map扩容选择增量&#xff08;渐进式扩容&#xff09;&#xff1f;迁移是逐步进行的。那如果在途中又要扩容了&#xff0c;怎么办&#xff1f; map翻倍扩容原理 map写入数据内…

Easysearch:语义搜索、知识图和向量数据库概述

什么是语义搜索&#xff1f; 语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容&#xff0c;而不仅仅是根据关键词匹配&#xff0c;还通过分析查询的语义和上下文来提供更准确和相关的…

Spring与Redis集成

1.引入RedisTemplate 据以前的情况&#xff0c;我们在Java中使用Redis时一般是使用Jedis来操作的&#xff0c;大致的一段代码如下所示 Overridepublic User findUserById(Integer id) {User user null;Jedis jedis null;try {jedis jedisPool.getResource();String userStr…

【YOLO系列算法俯视视角下舰船目标检测】

YOLO系列算法俯视视角下舰船目标检测 数据集和模型YOLO系列算法俯视视角下舰船目标检测YOLO系列算法俯视视角下舰船目标检测可视化结果 数据集和模型 数据和模型下载&#xff1a; YOLOv6俯视视角下舰船目标检测训练好的舰船目标检测模型舰船目标检测数据YOLOv7俯视视角下舰船…

机器学习|ROC曲线和AUC值

概念AUC&#xff08;Area Under Curve&#xff09;被定义为ROC曲线下的面积。其中&#xff0c;ROC曲线全称为受试者工作特征曲线 &#xff08;receiver operating characteristic curve&#xff09;&#xff0c; 模型会计算出所判断事物为汉堡&#x1f354;的概率&#xff0c;而…

基于DataKit迁移MySQL到openGauss

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

华为二层交换机与防火墙配置上网示例

二层交换机与防火墙对接上网配置示例 组网图形 图1 二层交换机与防火墙对接上网组网图 二层交换机简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 二层交换机简介 二层交换机指的是仅能够进行二层转发&#xff0c;不能进行三层转发的交换机。也就是说仅支持二层…