【Hot 100 刷题计划】 LeetCode 24. 两两交换链表中的节点 | C++ 精准指针舞步

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

📌 题目描述

题目级别:中等

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

  • 示例 1:
    输入:head = [1,2,3,4]
    输出:[2,1,4,3]

💡 破题思路:Dummy 节点与指针重定向

在链表中进行"交换"或"删除"操作时,最棘手的问题往往是如何处理头节点 的变化。

为了让头节点的变化逻辑和普通节点完全一致,我们引入了链表题的万能钥匙:虚拟头节点 (Dummy Node)。

核心逻辑拆解:

每次我们要交换两个相邻节点(设为 n1 和 n2)时,我们必须要知道它们前一个节点 的位置(设为 cur),因为交换完成后,前一个节点的 next 指针需要重新指向新的头节点(即 n2)。

具体的"指针舞步"如下:

  1. 锁定位置:找到 cur(初始为 dummy),并确认它后面至少还有两个节点可以交换。
  2. 标记目标:定义 n1 = cur->next,n2 = cur->next->next。
  3. 断开与重连(核心 3 步) :
    • n1->next = n2->next; (让原来的第一个节点连上后续的长尾巴,防止断链)
    • n2->next = n1; (让第二个节点回头指向第一个节点,完成内部翻转)
    • cur->next = n2; (让守门员 cur 连上翻转后的新头部 n2)
  4. 推进战线:交换完成后,n1 已经跑到了后面,它现在是下一对节点的前驱节点。我们让 cur = n1,继续下一轮循环。

💻 C++ 代码实现 (原汁原味作者版)

cpp 复制代码
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        // 引入虚拟头节点,巧妙化解真实头节点被交换的边界问题
        ListNode *dummy = new ListNode(0, head);
        ListNode *cur = dummy;

        // 只要 cur 后面还有至少两个节点,就可以继续交换
        while (cur->next && cur->next->next)
        {
            // 标记待交换的两个节点
            ListNode *n1 = cur->next;
            ListNode *n2 = cur->next->next;

            // 开始"指针舞步"
            n1->next = n2->next; // 步骤 1:n1 牵手 n2 后面的节点
            n2->next = n1;       // 步骤 2:n2 回头拥抱 n1
            cur->next = n2;      // 步骤 3:前面的链表接上新的局部头节点 n2

            // cur 移动到已经交换完毕的末尾节点 (即 n1),准备下一轮
            cur = n1;
        }
        
        // 返回虚拟头节点的下一个节点,即真正的链表头
        return dummy->next;
    }
};
相关推荐
青少儿编程课堂1 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
FlightYe10 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
by2099911 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble12 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长12 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall13 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊13 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
文丑颜不良啊13 小时前
LeetCode1661~1680题目解析
java·leetcode
你怎么知道我是队长16 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
青少儿编程课堂16 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛