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

news/2025/3/23 16:54:28/

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

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

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

在本题中哨兵可以保护我们不做空指针操作。我们之前做过反转链表,那时候我们需要用到三个节点来操作,而一个前驱节点(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.ppmy.cn/news/1008873.html

相关文章

规范Commit格式

规范Commit格式 Jenkins根据对比当次构建和上次构建的Commit信息来生成ChangeLog,但因为我们目前的提交不够规范,经常有类似"#","update"这列的提交,无法提供给PM有效的更新记录,所以建议大家尽量规范Commit…

合并两个有序链表(leetcode)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]思路 每次递归都会比较当前两个节点的值,选择较小的节点作为合并后的链…

系列3-常见的高可用MySQL解决方案

高可用主要解决两个问题,如何实现数据共享和同步数据、如何处理failover,数据共享的解决方案一般是SAN,数据同步通过rsync和drbd技术来实现。 1、主从复制解决方案 这是MySQL自身的高可用解决方案,数据同步方法采用的是MySQL rep…

python字符串输入输出与注解

目录 数据输入 前言 数据输出 字符串 字符串的三种定义方法 引号嵌套 字符串的拼接 字符串格式化 拼接字符串缺点 python常用的格式符号 格式化的精度控制 字符串快速格式化 快速格式化特点 对表达式进行格式化 具体案例 字符串的大小比较 字符串比较方式 变…

Java课设--学生信息管理系统(例1)

文章目录 前提一、运行效果二、Text实现类三、Manage选择类四、StudentWay学生方法类五、StudnetSql数据库类 前题 例1为无使用GUI图形界面,例2使用GUI图形界面! 首先自己的JDBC驱动已经接好了,连接自己的数据库没有问题。连接数据库可以看…

【李宏毅机器学习·学习笔记】Tips for Training: Adaptive Learning Rate

本节课主要介绍了Adaptive Learning Rate的基本思想和方法。通过使用Adaptive Learning Rate的策略,在训练深度神经网络时程序能实现在不同参数、不同iteration中,学习率不同。 本节课涉及到的算法或策略有:Adgrad、RMSProp、Adam、Learning …

桐乡嘉兴平面设计培训_PS一对一速成培训有吗

嘉兴平面设计培训_PS一对一速成培训有吗 0基础学广告海报页面培训 小班制学ps软件课程 嘉兴本地培训18年欢迎咨询 学校地址: 嘉兴市南湖区中山东路205号嘉华广场4楼416 海宁市西山路832号金贸大厦11楼1101号 桐乡市吾悦广场第吾大道(金街)1楼1058号 软…

JavaScript class 类

类是用于创建对象的模板。 我们使用 class 关键字来创建一个类,类体在一对大括号 {} 中,我们可以在大括号 {} 中定义类成员的位置,如方法或构造函数。 constructor构造方法 构造方法在创建新对象时会自动执行,用于创建和初始化对…