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

题目链接

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

思路

核心思路是通过「虚拟头节点 + 节点删除 / 插入」的方式实现两两交换:

  1. 先创建一个虚拟头节点(dummy) 指向原链表头节点,避免处理头节点交换的特殊情况;
  2. 遍历链表时,每次定位到需要交换的两个相邻节点(记为 first、second);
  3. 先将 first 节点从原位置 "删除",再将 first 节点插入到 second 节点的后面;
  4. 移动遍历指针,重复上述过程直到所有两两节点交换完成。

图解过程

plain 复制代码
输入:head = [1,2,3,4]
输出:[2,1,4,3]

1.初始化链表

ListNode dummy = new ListNode(-1, head);

ListNode cur = dummy;

重复上面过程

代码

java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 两两交换链表中的节点 {

    static class ListNode {
        int val;
        ListNode next;

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }

    }

    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {
        String[] s = in.readLine().split(" ");
        ListNode head = new ListNode(Integer.parseInt(s[0]));
        ListNode cur = head;
        // 1 2 3
        for (int i = 1; i < s.length; i++) {
            ListNode node = new ListNode(Integer.parseInt(s[i]));
            cur.next = node;
            cur = cur.next;
        }
        ListNode newHead = swapPairs(head);
        cur = newHead;
        while (cur != null) {
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
    }

    // 思路 删除第一个节点 并记录 然后放到第二个节点后面
    public static ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode dummy = new ListNode(-1, head);
        ListNode cur = dummy;
        while (cur.next != null && cur.next.next != null) {
            // 记录第一个节点
            ListNode first = cur.next;
            // 删除第一个节点
            cur.next = cur.next.next;
            // 记录后面的节点
            ListNode second = cur.next.next;
            cur.next.next = first;
            first.next = second;
            cur = cur.next.next;
        }
        return dummy.next;
    }

}
相关推荐
naruto_lnq18 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq19 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq19 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)20 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi20 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱21 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头21 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头21 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
咖丨喱1 天前
IP校验和算法解析与实现
网络·tcp/ip·算法
罗湖老棍子1 天前
括号配对(信息学奥赛一本通- P1572)
算法·动态规划·区间dp·字符串匹配·区间动态规划