Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【链表】两两交换链表中的节点,你会了吗?

【链表】两两交换链表中的节点,你会了吗?

作者头像
利刃大大
发布于 2025-05-21 03:30:12
发布于 2025-05-21 03:30:12
8100
代码可运行
举报
文章被收录于专栏:csdn文章搬运csdn文章搬运
运行总次数:0
代码可运行

24. 两两交换链表中的节点

24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:head = []
输出:[]

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

解题思路

一定要画图!

​ 这道题要求说是两两交换,那么我们可以使用双指针来进行遍历交换,双指针一个指向前面节点,一个指向后面节点,如果说其中一个结点为空,那么我们就没必要交换了,也就是可以退出循环了!

​ 考虑到头节点的判断,我们习惯性的使用哨兵头节点 tummy 来指向 head,减少工作量!

​ 我们设置三个指针,其中 cur 为当前结点,nextcur 的后置结点,我们每次就是要交换它们两个节点(注意是交换节点本身而不是节点的值)。这个时候判断一下 next 是否存在,若不存在则可以直接 break,因为我们是两两交换,若只有一个节点的话则不需要交换了!

​ 若 next 存在的话,我们则让 cur->next = next->next ,并让 next->next = cur,这样子我们就交换了它们的顺序,但是注意这里有个易错点,那么就是如果 cur 不是头节点的话,也就是 cur 还存在前驱节点的话,此时这个前驱节点还指向着 cur,我们需要将这个前驱节点的指向改过来指向 next,所以我们用一个指针 pre 作为 cur 的前驱节点,每次交换后要更新 pre->next,并将 pre 移动到 cur 的位置也就是下一个前驱节点的位置,可以参考下图,下图只画出了一步,其它的都是类似的,自行思考!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* newhead = new ListNode(0, head); // 虚拟头节点
        ListNode* prev = newhead;
        ListNode* cur = head;
        while(cur != nullptr && cur->next != nullptr) // 因为要操作两个节点,所以如果其中一个为空了那就不需要了
        {
            // 进行链接
            ListNode* next = cur->next;
            cur->next = next->next;
            next->next = cur;
            prev->next = next;
			
            // 往后移动
            prev = cur;
            cur = cur->next;
        }
        ListNode* tmp = newhead->next;
        delete newhead;
        return tmp;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
_小羊_
2025/05/17
680
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
【算法学习】链表篇:链表的常用技巧和操作总结
https://blog.csdn.net/2301_80220607/category_12922080.html?spm=1001.2014.3001.5482
GG Bond1
2025/04/10
1120
【算法学习】链表篇:链表的常用技巧和操作总结
算法专题八: 链表
3. 不要吝啬空间, 大胆定义变量 4. 快慢双指针, (判环, 找链表中环的入口, 找链表中倒数第n个节点)
用户11317877
2024/10/20
1430
算法专题八: 链表
【链表世界的深度探索:从基础到高阶的算法解读】—— LeetCode
不知道大家看到这题的第一个想法是什么?当时我想到的是,在一条马路上,一个人走两步步频,一个人走一步步频,那么当走两步那个人到达终点的时候,走一步的那个人就是在终点了
用户11286421
2025/03/18
550
【链表世界的深度探索:从基础到高阶的算法解读】—— LeetCode
【递归】两两交换链表中的节点!
​ 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
利刃大大
2025/05/22
860
【递归】两两交换链表中的节点!
LeetCode | 24.两两交换链表中的节点
上面的题就是 两两交换链表中的节点 题目的截图,同时 LeetCode 给出了一个函数的定义,然后要求实现链表两两交换的函数体。函数定义如下:
码农UP2U
2020/08/26
4710
LeetCode | 24.两两交换链表中的节点
【算法/学习】:搞懂链表题型,这一篇就够了
链表(Linked List) 是一种线性数据结构,由一系列节点组成。每个节点包含两个部分:
IsLand1314
2025/02/25
1130
【算法/学习】:搞懂链表题型,这一篇就够了
Leetcode | 第3节:链表
链表是非常重要的一种数据结构,它的好坏处我们不讳言,毕竟这是在考写代码不是在考System Design2333,但是链表其实也很麻烦,学过链表的就知道,在链表中做添加,删除等等,是需要注意很多细节的。因此有必要单独开一个专题说一下。
学弱猹
2021/08/10
3000
Leetcode | 第3节:链表
【数据结构】-----双链表(小白必看!!!)
c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.
用户11036582
2024/04/16
1060
【DFS】汉诺塔问题 / 反转链表 / 求根节点到叶节点数字之和 / 验证二叉搜索树
要将a柱上n个的盘子借助b柱放到c柱上,应该先将a柱上的n-1个盘子借助c放到b上,然后再将b柱上的n-1个盘子借助a柱放到c柱上,以此往复。
_小羊_
2025/04/09
1130
【DFS】汉诺塔问题 / 反转链表 / 求根节点到叶节点数字之和 / 验证二叉搜索树
【递归、搜索与回溯算法练习】day2
24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
摘星
2023/10/15
1370
【递归、搜索与回溯算法练习】day2
图解LeetCode——24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
爪哇缪斯
2023/05/25
5340
图解LeetCode——24. 两两交换链表中的节点
轻触节点,链表里的悄然邂逅
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
Undoom
2024/10/19
1060
轻触节点,链表里的悄然邂逅
【数据结构】链表 & 树,你也被绕晕了?不妨来这看看
快慢指针法: 快指针和慢指针初始时指向头节点,当快指针指向和快指针指向节点内的next指针不为空时,快指针一次走两步,慢指针一次走一步,快指针入环后走N圈后慢指针入环,当快指针和慢指针相等时说明存在环,如果出循环则说明不存在环。
_小羊_
2025/04/05
660
【数据结构】链表 & 树,你也被绕晕了?不妨来这看看
Leetcode_203.移除链表元素—C语言
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
小李很执着
2024/06/15
1000
Leetcode_203.移除链表元素—C语言
☆打卡算法☆LeetCode 24、两两交换链表中的节点 算法解析
链接:24. 两两交换链表中的节点 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
2020
☆打卡算法☆LeetCode 24、两两交换链表中的节点  算法解析
【递归,搜索与回溯算法篇】专题(一) - 递归
在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出移到下一根柱子; (3) 盘子只能叠在比它大的盘子上。
_孙同学
2025/05/10
1190
【递归,搜索与回溯算法篇】专题(一) - 递归
【数据结构与算法】手撕链表OJ题
思路一:一种比较普遍的方式,边遍历边找不同。我们可以通过定义两个指针,一个指向头节点,一个置为NULL。当遇到值为相同的时候,直接跳过去。指向下一位。同时,我们要去注意头删的问题,因为题目中给出的函数具有头结点head。
平凡的人1
2022/11/15
2880
【数据结构与算法】手撕链表OJ题
反转还不行,要两两交换!
建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。
代码随想录
2021/06/17
4500
两两交换链表中的节点
通过迭代的方式实现两两交换链表中的节点,直接遍历整个链表即可,首先定义一个空的头结点,之后定义前置节点与当前正需要处理的节点,当正在处理的节点存在以及当前节点的下一个节点都存在时进行循环,将当前节点与当前节点的下一个节点进行缓存,之后将curNode节点的next赋值为nextNode节点的next,即首先将该节点的下一个节点指向nextNode的下一个节点,之后将preNode的next赋值为nextNode,将nextNode的next赋值为curNode,最后将preNode赋值为curNode,curNode赋值为curNode的next,注意此时的curNode其实已经被交换换成了,是两个节点中的后一个节点,最后等待循环完成后返回头结点的next即可。
WindRunnerMax
2020/10/26
4680
推荐阅读
相关推荐
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验