【LeetCode链表#9】图解:两两交换链表节点
两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路
这里还是要应用虚拟头节点,不然交换链表头节点的操作会与交换其他节点时不同
交换的过程其实不难理解,但是代码实现过程需要注意很多细节
下面是交换过程的图解
首先,定义一个虚拟头节点
并让当前指针cur指向dummy head【注意:cur一定要在需要操作的两个节点之前】
然后按途中顺序将对应节点的next指好即可
注意:虽然画图我们很好理解,但是在操作过程中有很多细分步骤,如果直接上手写代码会很困惑
例如,当dummy指向节点2(也就是cur.next.next)后,dummy与原来的节点1就断开连接了
此时再想通过cur去寻找到节点1(cur.next)就行不通了,进而节点2也就无法指向节点1,步骤②无法继续进行
与翻转链表时类似,我们需要一个临时节点temp先去保存节点1
让节点2通过指向temp的方式找到节点1
ps:为什么不存节点2?因为步骤①之后节点2就已经是cur.next了,而dummy是不会变的,所以怎么都能找到节点2
当节点2指向temp(储存有cur.next)后,节点2与原来的节点3就断开连接了
同理,我们应该把节点3也用临时节点保存,这里用temp1保存
于是节点2指向节点3的过程就变成了:
temp1是节点3的备份,它后面还是和节点4连着,所以不用担心找不到节点4
至此,节点1与节点2完成了交换,cur移动到cur.next.next(即交换后此处为节点1,是什么节点并不重要,反正待会交换的又不是当前cur指向的节点,而是后两个节点),展开后的结果如下:
链表节点数为奇数时,结束条件:cur.next.next = null
链表节点数为偶数时,结束条件:cur.next = null
代码
思路通过画图可以很好理解,但是代码实现又有很多坑
class Solution {
public ListNode swapPairs(ListNode head) {
//定义虚拟头节点
ListNode dummy = new ListNode(0);
dummy.next = head;//虚拟头节点指向head
ListNode cur = dummy;
//定义临时节点用于保存节点1、3
ListNode temp;
ListNode temp1;
//遍历链表
//注意这里的结束条件,链表节点数为奇偶情况下是不同的
//需要先验证cur.next再验证cur.next.next
//要不然如果是偶数个节点你先验cur.next.next直接就空指针异常了
while(cur.next != null && cur.next.next != null ){
//这里下意识肯定就想开始交换了,但如果不先保存节点就会出现空指针异常
temp = cur.next;
temp1 = cur.next.next.next;
cur.next = cur.next.next;//dummy换2
cur.next.next = temp;//2换1
cur.next.next.next = temp1;//1换3
cur = cur.next.next;//移动cur至新的待交换的两个节点前
}
//遍历结束,返回dummy的下一个节点即可
return dummy.next;
}
}
易错点:
1、创建完dummy后记得指向head
2、交换过程中要以cur为参照点来表示参与交换的节点,不要变,例如1换3时不能写成
`temp.next = temp1;
最新文章
- C# 工厂模式示例
- vs自带服务测试工具
- datagridview用get,set访问并加锁,可以控制所有使用datagridview的地方都顺序进行访问
- C++,常成员函数
- C++中string类的使用方法
- Spring Boot 1.4测试的改进
- Hadoop系列003-Hadoop运行环境搭建
- MongoDB,从数组中删除对象
- python—迭代器、生成器
- JavaScript 基础结构
- BZOJ 4259 残缺的字符串
- Quartz Cron表达式详解
- asp.net core 创建允许跨域请求的api, cors.
- lxml xpath 爬取并正常显示中文内容
- atom插件安装失败解决方法
- sql语句,查询昨天的数据
- jQuery 簡介
- P1292 倒酒
- js数组去重五种方法
- MySQL数据操作(DML)
热门文章
- C#实现生成Markdown文档目录树
- 2.pygame快速入门-绘制图像
- CentOS 7.9 Related Software Directory
- MyBatis笔记03------XXXMapper.xml文件解析
- Jupyter基本使用
- C# 多线程访问之 SemaphoreSlim(信号量)【C# 进阶】
- 畅联云平台(www.24hlink.cn)支持的用传列表
- 洛谷 P4135 作诗 题解
- [leetcode] 547. Number of Provinces
- Axios +Vue + themeleay