【力扣每日一题】2023.8.6 两两交换链表中的节点

news2024/11/26 1:00:15

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们一个链表,让我们两两交换相邻节点的值,并且不能通过修改节点内部的值来达到这一目的,如果可以直接修改的话那就很简单了,不可以就会稍微复杂一点点。

不过这题还是比较考验操作链表的基本功了。一般要操作链表的题目,我们都需要定义一个节点指向初始链表的头结点,我们一般叫它哨兵,当然了在栈中也有哨兵这个概念。

在本题中哨兵可以保护我们不做空指针操作。我们之前做过反转链表,那时候我们需要用到三个节点来操作,而一个前驱节点(pre)一开始是空指针,只有在后面才会更新。如果链表很短的话,那么前驱节点(pre)就得不到更新,如果我们操作它,那么就会操作到空指针进而引发异常。

而有了哨兵,因为哨兵的后驱就是初始链表的头结点,所以前驱节点(pre)可以更新为哨兵,这样就操作不到空指针了。

那介绍完了哨兵的作用,我们再来看看这道题应该怎么做到两两交换。

涉及到节点交换,我们都是需要三个节点来帮助我们的进行操作的,前驱节点(pre),当前节点(cur),后驱节点(next)。 

因为是两两交换,换之后第一个节点在后面的位置,第二个节点在前面的位置,我们操作之前当前节点指向的是第一个节点,前驱节点指向的是第一个节点的上一个节点。

需要我们在循环体里更新的是后驱节点,更新为当前节点的下一个节点。并且循环的条件是当前节点以及当前节点的下一个节点都不是空指针,不满足条件则表名剩下的节点不到两个,不足以让我们进行操作。

然后我们将当前指针的后驱改为后驱指针(next)的后驱,再将后驱指针(next)的后驱改为当前节点,这样我们就将两个节点的先后顺序交换了,不过仅限于这两个节点和两个节点后面的相邻节点,因为我们还需要修改这两个节点之前的相邻节点的指向。

所以还需要将前驱节点(pre)的后驱改为后驱节点(next),这样就算交换完毕了。

为了进行下一次的循环,我们需要移动当前节点(cur)和前驱节点(pre)。将前驱节点移动到当前节点的位置,再将当前节点移动到它的后驱。

这样一直循环直到剩余链表不足两个节点即退出循环。再将哨兵的后驱返回出去就可以啦。

 代码:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* res=new ListNode(0,head);
        ListNode* pre=res;
        while(head!=nullptr && head->next!=nullptr){
            ListNode* next=head->next;
            head->next=next->next;
            next->next=head;
            pre->next=next;
            pre=head;
            head=head->next;
        }
        return res->next;
    }
};

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

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

相关文章

NERFS 与现实捕捉 - 弥合现实世界与数字世界之间的差距

NERF介绍 近年来,计算机视觉和图形领域取得了显着的进步,催生了革命性的技术,改变了各个行业。 NERFS(神经辐射场)和现实捕捉是两项备受关注的重要技术。 NERFS 和现实捕捉都是以数字形式捕捉和重建现实世界的强大工具…

无涯教程-Perl - dbmclose函数

描述 此函数关闭哈希和DBM文件之间的绑定。将领带功能与合适的模块配合使用。 语法 以下是此函数的简单语法- dbmclose HASH返回值 如果失败,此函数返回0,如果成功,则返回1。 请注意,在大型DBM文件上使用键和值之类的功能时,它们可能会返回巨大的列表。您可能更喜欢使用e…

HBase-写流程

写流程顺序正如API编写顺序,首先创建HBase的重量级连接 (1)读取本地缓存中的Meta表信息;(第一次启动客户端为空) (2)向ZK发起读取Meta表所在位置的请求; (…

chapter13:springboot与任务

Spring Boot与任务视频 1. 异步任务 使用注解 Async 开启一个异步线程任务, 需要在主启动类上添加注解EnableAsync开启异步配置; Service public class AsyncService {Asyncpublic void hello() {try {Thread.sleep(3000);} catch (InterruptedExcept…

为什么很多人都在吹ChatGPT改变世界?一文全面了解

ChatGPT早已让全世界的互联网炸锅,它已经从一个新颖的聊天机器人演变成一项推动下一个创新时代到来的技术。已经很久没有出现一款让大家充满兴趣、兴奋、恐惧且具有争议的科技产品了。 如果你现在才接触到它,你可能会想知道这到底是怎么回事。这里建议你…

linux gcc __attribute__

__attribute__ 1. 函数属性1.1 __attribute__((noreturn))1.2 __attribute__((format))1.3 __attribute__((const)) 2. 变量属性2.1. __attribute__((aligned))2.2. __attribute__((packed)) 3. 类型属性 __attribute__ 是 GCC 编译器提供的一种特殊语法,它可以用于…

测试该知道的二三事:浅谈响应式网页设计

1.起因 最近几天正巧在帮朋友的公司团队做质量保障体系的培训,在此期间与几个测试人员闲聊,正是其中的一件事让我对今天的话题提起了兴趣:朋友公司里的研发团队招了一个应届毕业生,做了半年之后接了某个web项目的其中一个拓展功能…

质检工具(FindBugs、CheckStyle、Junit、Jmeter、Apifox)

1、Findbugs IDEA软件中可以装该插件,2018版本以前主要搜索FindBugs-IDEA 、2018版本以后主要搜索 SpotBugs。 1.1、FindBugs-IDEA安装及使用流程: 1.2、SpotBugs安装及使用流程: 2、Checkstyle IDEA软件中可以装该插件,所有版本的插件一致:CheckStyle 2.1、安装流程…

【C# 基础精讲】为什么选择C# ?

C#(C Sharp)是由微软开发的一种通用、面向对象的编程语言。它最初于2000年发布,自那时以来逐渐成为开发者的首选之一。C#的设计目标是提供一种简单、现代、可靠且安全的编程语言,使开发者能够轻松构建各种类型的应用程序。 为什么…

Apache Doris 助力中国联通万亿日志数据分析提速 10 倍

本文导读: 在数据安全管理体系的背后,离不开对安全日志数据的存储与分析。以终端设备为例,中国联通每天会产生百亿级别的日志数据,对于保障网络安全、提高系统稳定性和可靠性具有至关重要的作用。目前,Apache Doris 在…

解决树莓派“由于没有公钥,无法验证下列签名“

目录 简介:在换完国内源后,树莓派尝试更新同步/etc/apt/sources.list和/etc/apt/sources.list.d中列出的软件源的软件包版本也就是(apt-get update)和更新已安装的所有或者指定软件包(也即是apt-get upgrade&#xff0…

java+springboot摄影作品竞赛报名系统 微信小程序--论文

随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。网上管理,它将是直接管理摄影竞赛小程序的最新形式。本小程序是以构建摄影竞赛为目标,使用java技术制作,…

xLua学习

xLua教程:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md xLua配置:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/configure.md FAQ:https://github.com/Tencent/xLua/blob/maste…

【Leetcode】反转链表||基础题||击败100%(头插法)

step by step. 题目: 反转链表,基础题了,要很熟练的境界—— 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示…

awk筛选给定时间范围内的日志

目录标题 筛选日志时间示例编写1.awk文件准备一个需要筛选时间的日志执行awk命令 筛选日志时间 grep/sed/awk用正则去筛选日志时,如果要精确到小时、分钟、秒,则非常难以实现。 但是awk提供了mktime()函数,它可以将时间转换成epoch时间值。 …

opencv基础43- 图像梯度-Laplacian 算子( cv2.Laplacian)边缘检测基础

Laplacian算子是一种图像处理中常用的边缘检测算子,它用于检测图像中的边缘和轮廓。该算子计算图像中每个像素点的二阶导数,从而突出图像中灰度值变化较大的区域,这些区域通常对应图像的边缘或者轮廓。 Laplacian(拉普拉斯&#x…

【Spring Cloud 七】Sleuth+Zipkin 链路追踪

Sleuth链路追踪 系列博客背景一、 什么是链路追踪二、为什么要有链路追踪三、Sleuth与ZipkinSleuthZipkinSleuth和Zipkin的关系是什么? 四、使用Sleuthzipkin进行链路追踪4.1下载zipkin4.2案例说明项目代码服务提供者pom文件yml配置文件项目启动类controller 抽离出…

Android network — iptables四表五链

Android network — iptables四表五链 1. iptables简介2. iptables的四表五链2.1 iptables流程图2.2 四表2.3 五链2.4 iptables的常见情况 3. NAT工作原理3.1 BNAT3.2 NAPT 4. iptables配置 本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理。 1. i…

MyBatis-Flex 一个优雅的 MyBatis 增强框架

文章目录 网站MyBatis-Flex 是什么特征1、很轻量2、只增强3、高性能4、更灵动 快速开始hello world(原生)QueryWrapper 示例select *select columnsselect functionswherewhere 动态条件 1where 动态条件 2where 自动忽略 null 值where selectexists, no…

AlmaLinux 9 安装 Go 1.20

AlmaLinux 9 安装 Golang 1.20 1. 下载 go 安装包2. 安装 go3. 配置环境变量4. 确认 go 版本 1. 下载 go 安装包 访问 https://go.dev/dl/,下载你想安装的版本,比如 go1.20.7.linux-amd64.tar.gz, 2. 安装 go (可选)删除旧版本,…