两两交换链表中的节点

力扣题目链接(opens new window)

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

思路

这里还是要应用虚拟头节点,不然交换链表头节点的操作会与交换其他节点时不同

交换的过程其实不难理解,但是代码实现过程需要注意很多细节

下面是交换过程的图解

首先,定义一个虚拟头节点

并让当前指针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;

【LeetCode链表#9】图解:两两交换链表节点的更多相关文章

  1. LeetCode 024 Swap Nodes in Pairs 交换链表中相邻的两个节点

    Given a linked list, swap every two adjacent nodes and return its head.For example,Given 1->2-> ...

  2. [leetcode]24. Swap Nodes in Pairs交换链表的节点

    感觉这个题后台的运行程序有问题,一开始自己想的是反转链表那道题的方法,只是隔一个节点执行一次,但是没有通过,TLE了,但是很奇怪,并没有死循环,就是最后返回的时候超时. 最后的思路就是很简单的进行交换 ...

  3. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  4. 【LeetCode】Swap Nodes in Pairs(两两交换链表中的节点)

    这是LeetCode里的第24题. 题目要求: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定1->2->3->4, 你应该返回2->1->4- ...

  5. Java实现 LeetCode 24 两两交换链表中的节点

    24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3-&g ...

  6. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  7. [LeetCode] 24. 两两交换链表中的节点

    题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是 ...

  8. LeetCode(24): 两两交换链表中的节点

    Medium! 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说 ...

  9. Leetcode题库——24.两两交换链表中的节点

    @author: ZZQ @software: PyCharm @file: swapPairs.py @time: 2018/10/20 19:49 说明:给定一个链表,两两交换其中相邻的节点,并返 ...

  10. #leetcode刷题之路24-两两交换链表中的节点

    给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3->4, 你应该返回 2-> ...

随机推荐

  1. python更改文件后缀名

    path = '1024.png' extension = 'jpg' for i in range(1,len(path)): if (path[-i] == '.'):#找到后缀初始点 new_p ...

  2. python求列表均值,方差,标准差

    import numpy as np a = [1,2,3,4,5,6] #求均值 a_mean = np.mean(a) #求方差 a_var = np.var(a) #求标准差 a_std = n ...

  3. LcdTools如何添加图片画面到PX01显示

    LcdTools打开点屏工程,切到"画面设置"栏,在"画面资源"栏选择"Picture"画面,先设置图片ID编号(此编号用于PG对图片编号, ...

  4. SimpleDateFormat线程安全问题排查

    一. 问题现象 运营部门反馈使用小程序配置的拉新现金红包活动二维码,在扫码后跳转至404页面. 二. 原因排查 首先,检查扫码后的跳转链接地址不是对应二维码的实际URL,根据代码逻辑推测,可能是acc ...

  5. MQTT GUI 客户端 可视化管理工具推荐

    一款好用的 MQTT 客户端工具可以极大地提高开发者使用MQTT的效率.MQTT 客户端工具常用于建立与 MQTT 服务器的连接,进行主题订阅.消息收发等操作. 今天,在此推荐一款优秀的MQTT GU ...

  6. 嵌入式-C语言基础:数组得初始化

    #include<stdio.h> int main() { int a[10]; int size=sizeof(a)/sizeof(a[0]);//计算数组得大小 for(int i= ...

  7. 前后端结合解决Excel海量公式计算的性能问题

    背景 在数据密集的业务领域,尤其是金融,保险,税务等行业中,经常需要利用Excel模型,来对业务进行分析和处理.例如: 1.金融投资: 根据模型进行估值计算,并对投资风险进行评估,通过测算出投资的内部 ...

  8. IDEA项目下out与target目录的区别详解

    IDEA项目下out与target目录的区别详解 一.目录主要区别: out存放的是该项目下所有Module(模块)的编译结果. target存放的是单个Module的编译结果. 二.目录详解 out ...

  9. 6 STL-vector

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...

  10. 解决sox报错sox FAIL formats: no handler for given file type `mp3

    sudo apt-get install libsox-fmt-mp3