【算法-链表2】反转链表 和 两两交换链表节点

news2024/11/25 22:41:17

今天,带来链表相关算法的讲解。文中不足错漏之处望请斧正!

理论基础点这里


反转链表

1. 思路

链表操作的本质是修改连接关系,本题我们需要反转链表,也就是每次都让当前节点的next指向自己的上一个。而题目给的是单链表,所以我们需要始终记录前一个节点的地址,来满足当前节点被反转的条件;其次,我们当前节点迭代时要按原本顺序迭代。

2. 参考代码

class Solution6 {
public:
    ListNode *reverseList(ListNode *head) {
        // 每次都让当前节点的next指向前一个节点, 迭代时仍然向后迭代
        ListNode *prev = nullptr;
        ListNode *cur = head;
        ListNode *next = nullptr;
        while (cur != nullptr) {
            next = cur->next; // 保存, 等会要覆盖
            cur->next = prev; // 改变链接关系:让当前节点的next指向前一个节点
            prev = cur;
            cur = next; // 迭代时仍然向后迭代
        }
        return prev; // 当cur走到空, prev正好是最后一个节点, 即新的反转链表的头节点
    }
};

两两交换链表节点

1. 思路

像这种需要改变链接关系的场景,我们都可以给上一个虚拟头节点,来保证改变链接关系的逻辑相同。

具体如何交换呢?

在这里插入图片描述

1. 要能找得到

《移除链表元素》中,我们已经谈过,要操作节点1和节点2,我们必须要能找得到节点1和节点2

2. 统一操作逻辑

对单链表来说,当我们要从头开始操作的时候,逻辑和正常的交换不一样,所以我们选择加入虚拟头结点,来统一交换逻辑。操作逻辑是什么呢?如图。

在这里插入图片描述

3. 何时结束交换?

我们给一个cur,一开始指向dummyHead,它来操作后两个节点。

前提是后面还有两个节点可以操作,所以当cur->next != nullptr && cur->next->next != nullptr的时候我们可以进行操作,反之结束。

这里是有细节的:

  1. cur不可能为空,因为我们给他初始化为dummyHead
  2. cur→next的判断必须放在前面,因为表达式是从左到右判断,如果cur→next→next的判断放在前面,当cur→next==nullptr,对cur→next→next的判断就对空指针解引用了

4. 改变链接需谨慎

修改节点间的链接关系,很容易丢失节点或陷入死循环。

在这里插入图片描述

如上图,要交换1和2,操作应该是:

  1. cur指向2
  2. 2指向1
  3. 1指向3

对应代码就是

  1. cur->next = cur->next->next

这里其实已经出问题了!cur->next被修改,代表1是丢失了。后续我们还需要让1指向3,找不到1了就没法玩。

同理,直接让2指向1以后,3也丢失了,1和3都找不到了。怎么办?

我们可以提前保存,直接把1、2、3保存为node1、node2、node3。

也可以不保存节点2,因为cur指向2后,2是可以找到的,但我们这样写可读性高点。

最后,cur应该怎么迭代呢?

在这里插入图片描述

应该移动两位。

2. 参考代码

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode *dummy = new ListNode(-1, head);
        ListNode *cur = dummy;

        while (cur->next && cur->next->next) { // 后面还有两个节点才能交换
            ListNode *node1 = cur->next;
            ListNode *node2 = cur->next->next;
            ListNode *node3 = cur->next->next->next;

            cur->next = node2; // cur->node2
            node2->next = node1; // node2->node1
            node1->next = node3; // node1->node3

            cur = cur->next->next; // 移动2位
        }

        head = dummy->next;
        delete dummy;
        dummy = nullptr;
        return head;        
    }
};

今天的分享就到这里了,感谢您能看到这里。

这里是培根的blog,期待与你共同进步!

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

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

相关文章

Linux tail命令:显示文件结尾的内容

tail 命令和 head 命令正好相反,它用来查看文件末尾的数据,其基本格式如下: [rootlocalhost ~]# tail [选项] 文件名 此命令常用的选项及含义 【例 1】查看 /etc/passwd 文件最后 3 行的数据内容。 [rootlocalhost ~]# tail -n 3 /etc/passwd…

jmeter接口自动化部署jenkins教程

首先,保证本地安装并部署了jenkins,jmeter,xslproc 我搭建的自动化测试框架是jmeterjenkinsxslproc ---注意:原理是,jmeter自生成的报告jtl文件,通过xslproc工具,再结合jmeter自带的模板修改&…

Linux - 进程程序替换 - C/C++ 如何实现与各个语言之间的相互调用 - 替换环境变量

前言 我们之前利用 fork()函数来创建子进程,这种方式是 父子进程 共用一个代码,只是在代码当中使用了 if-else 语句来分流,达到父子进程运行不同的代码块的目的。但是其实本质上,还是父子共用一个代码和数…

C进阶-编译环境与预处理

本章重点: 程序的翻译环境 程序的执行环境 详解:C语言程序的编译链接 预定义符号介绍 预处理指令#define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令#include 预处理指令#undef 条件编译 1. 程序的翻译环境和执行环境 在ANSI C的任何一…

基层医院、民营医院、二级医院his系统源码,云计算技术B/S架构

在我国,基层医院和民营医院在总体数量上占据很大比例,但信息化水平普遍偏低。造成这一现状的原因有很多,如对信息化的重视度不够、缺乏足够的资金投入等,严重局限了自己在市场上对系统的选择面,而且难以保证有效的维护…

PDF Expert for mac(苹果电脑专业pdf编辑器)兼容12系统

PDF Expert是macOS平台上的一款优秀的PDF阅读和编辑工具,由Readdle公司开发。它不仅拥有方便、易用的界面,还具备诸多功能,比如编辑PDF文件、添加批注、填写表格、签署文件、合并文档等。安装:PDF Expert for Mac(PDF编辑阅读转换器)v3.5.2中…

Springer LaTeX 模板,及使用Texworks编译参考文献不显示问题

模板下载地址:Manuscripts with mathematical content can also be submitted in LaTeX. We recommend using Springer Nature’s LaTeX template. 下载的压缩包中包含以下文件: 使用Texworks打开.tex文件,生成的PDF有参考文献,但…

一个界面现代美观,色彩年轻化的Vue3+SpringBoot3前后端分离中后台管理脚手架

📚 在线文档 | ✨ 提交需求 | 🚀 演示地址(账号/密码:admin/admin123) 简介 ContiNew Admin (Continue New Admin)中后台管理框架/脚手架,持续以最新流行技术栈构建,拥…

PCL点云处理(008)-euc_cluster

欧式聚类是一种基于距离的聚类算法,可以将点云中距离较近的点聚集在一起,形成一个簇。 在PCL库中,欧式聚类的实现原理是将点云中的每个点看作一个向量,然后计算这些向量之间的欧式距离。欧式距离是指两个向量之间的距离&#xff0…

视频电影和字幕如何合并?

我们在看一些国外的电影或者电视剧有时是没有字幕文件的,而对于普通人来说,没有字幕意味着我们无法看懂电影的剧情,好不容易获得的视频资源没有意义了,这种情况该怎么办呢? 其实这种情况完全不用怕,要知道…

【应用前沿】360QPaaS 精彩亮相首届中国航空制造设备博览会 | 数智航空

近日,首届“中国航空制造设备博览会”(CAEE2023)在宁波国际会展中心顺利召开,本届大会以“数智产融 开放发展”为主题,以“新技术、新产品、新服务、新企业”为定位,以特色化、专业化、品牌化、高端化为方向…

k8s-服务网格实战-配置 Mesh(灰度发布)

istio-02.png 在上一篇 k8s-服务网格实战-入门Istio中分享了如何安装部署 Istio,同时可以利用 Istio 实现 gRPC 的负载均衡。 今天我们更进一步,深入了解使用 Istio 的功能。从 Istio 的流量模型中可以看出:Istio 支持管理集群的出入口请求&a…

flutter生态一统甜夏 @Android @ios @windowse @macos @linux @Web

(愿景)G o o g l e 中 国flutter生态一统天下(IT) Web Android ios Windowse Macos Linux Google中国https://space.bilibili.com/64169458 https://pub-web.flutter-io.cn 构建 Flutter Web 应用 构建 Flutter Web 应用 - Flutter 中文文档 - Flutter 中文开发者网站 …

2023年下半年架构案例真题及答案

案例的考点: 大数据架构 Lambda架构和Kappa架构 jwt特点 数据持久层,Redis数据丢失,数据库读写分离方案 Hibernat架构 SysML七个关系,填需求图 大数据的必选题: 某网作为某电视台在互联网上的大型门户入口&#…

【vue 仿百度分页】

vue 仿百度分页 效果图 代码 公用组件 <template><nav class"pagination_nav"><ul class"pagination"><li :class"{ disabled: current 1 }"><a href"javascript:;" click"setCurrent(current - …

【Python大数据笔记_day04_Hadoop】

分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…

大型企业是否有必要进行数字化转型?_数据治理平台_光点科技

数字化转型是大型企业在现代商业环境中保持竞争力的关键。一开始我们要明确数字化转型指的是利用数字技术来改变企业的业务模式和企业文化&#xff0c;以提高效率和效益。对于大型企业而言&#xff0c;进行数字化转型有着多重必要性。 1.数字化转型可以帮助企业优化内部流程&am…

情感分析与LLMs角色扮演

深度学习自然语言处理 原创作者&#xff1a;wkk 就像人类在做一件事情的时候&#xff0c;可能需要尝试多次。LLM也是如此&#xff01;这对于情感分析任务尤其如此&#xff0c;在情感分析任务中&#xff0c;LLM需要深入推理来处理输入中的复杂语言现象&#xff08;例如&#xff…

SPASS-图表的创建编辑

点击折线图 展示图如下&#xff1a; 双击图表&#xff0c;可进行编辑 图表基本设定 选择、移动图表元素和调整图表元素的大小 鼠标点击图表元素选择Tab键进行轮换选择Ctrl键鼠标进行多个元素选择十字箭头——移动元素双头箭头——调整元素大小 更改图表的外观 文本的内容、…

MS2111多点低压差分(M-LVDS)线路驱动器和接收器

MS2111 是多点低压差分 (M-LVDS) 线路驱动器和接收器。经过 优化&#xff0c;可运行在高达 200Mbps 的信号速率下。所有部件均符合 M LVDS 标准 TIA / EIA-899 。该驱动器的输出支持负载低至 30Ω 的多 点总线。 MS2111 的接收器属于 Type-2 &#xff0c; 可在 -1…