算法-链表-二、成对交换两个节点

成对交换链表节点的题目要求将链表中每两个相邻节点交换位置。如果链表长度是奇数,最后一个节点保持不变。

算法思路:

  1. 通过遍历链表,每次交换两个相邻的节点。

  2. 需要考虑链表的头节点如何处理,可以使用虚拟头节点来简化边界条件的处理。

  3. 在每次交换时,确保指针的更新顺序正确:需要更新当前节点的前一个节点和后一个节点的指向。

步骤:

  1. 初始化一个虚拟头节点 dummy,它指向链表的头节点。

  2. 使用 prev 指针遍历链表,跳过一对节点并交换它们。

  3. 对于每一对相邻的节点 (node1, node2),执行如下交换:

    • prev.next = node2

    • node1.next = node2.next

    • node2.next = node1

  4. 更新 prev 到 node1,继续下一对节点。

java 复制代码
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public ListNode swapPairs(ListNode head) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;

    ListNode prev = dummy;

    while (prev.next != null && prev.next.next != null) {
        ListNode a = prev.next;
        ListNode b = a.next;

        // 核心三步交换
        a.next = b.next;
        b.next = a;
        //要能连起来
        prev.next = b;

        // prev 向后移动两步
        prev = a;
    }

    return dummy.next;
}
交换前:
prev -> a -> b -> next
交换后:
prev -> b -> a -> next
操作顺序不能错:
a.next = b.next
b.next = a
prev.next = b
相关推荐
UIU1146 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi6 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David7 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院8 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng8 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋11 小时前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~11 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py12 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing13 小时前
LeetCode100 42.接雨水
java·算法·leetcode