跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaNode.jsjava算法

链表两两交换的常见写法

用虚拟头节点配合指针重连,可以在不改节点值的前提下完成链表相邻节点两两交换。遍历时每次取出一对节点 first 和 second,依次修改 cur.next、second.next 和 first.next,最后把 cur 移到已交换片段的尾部继续处理。这个实现比递归更直观,也避免了头节点单独处理的麻烦。

信号故障发布于 2026/6/300 浏览

题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的头节点。这里不能只改节点里的值,得真的把节点位置换掉。

思路

这题最省心的写法,是先补一个虚拟头节点,再按两个节点一组去处理。这样做的好处很直接:头节点也能和普通节点一样处理,不用单独分支。

每一轮都盯着 cur.next 和 cur.next.next。前者是这一组里的第一个节点 first,后者是第二个节点 second。交换的时候不需要真的'搬家'两次,链表指针改四处就够了:先让 cur.next 跳过 first,指向 second;再让 second.next 指向 first;最后把 first.next 接回后面的剩余链表。

我更喜欢把 cur 留在已经处理好的那一段尾部。这样下一轮直接从新位置继续,不容易把指针绕乱。这个写法看起来步骤多,实际比递归稳定,也更适合顺手写一遍过。

执行流程

  1. 创建虚拟头节点 dummy,让它指向 head。
  2. 定义指针 cur 指向 dummy。
  3. 只要 cur.next 和 cur.next.next 都存在,就继续交换。
  4. 记录当前这一组的第一个节点 first = cur.next。
  5. 让 cur.next 指向 second,也就是 cur.next.next。
  6. 再把 second.next 指向 first。
  7. first.next 接回剩余链表。
  8. cur 后移到 first,准备处理下一组。

代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution {
    static class ListNode {
        int val;
        ListNode next;
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String[] s = in.readLine().split(" ");
        ListNode head = new ListNode(Integer.parseInt(s[0]));
        ListNode cur = head;
        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;
    }
}

小结

这类题的关键不在算法复杂度,而在指针顺序。只要先想清楚'谁连谁',再动手改指针,基本不会写崩。虚拟头节点是个小成本,但回报很高的习惯。

目录

  1. 题目描述
  2. 思路
  3. 执行流程
  4. 代码实现
  5. 小结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 与 PyCharm 安装与排错指南
  • MCP 服务器安装:npx 与 uvx/uvenv 的实操笔记
  • 用 PyMobileDevice3 管理 iOS 设备
  • 在 Linux 上把 OpenClaw 接到 QQ 机器人
  • Linux 下用 gdb 和 cgdb 调试 C/C++
  • LeetCode 962 最大宽度坡的 C 语言做法
  • 用 ImGui 快速搭一个 C++ 调试面板
  • 用 Python 把 CSV 导入 Neo4j 的实操记录
  • Python 与 CV 大模型下的滑块与点选验证码处理思路
  • OpenClaw 接入 QQ 的部署记录
  • 用 Verilog 做 FPGA 浮点运算和 PID 控制
  • 次模函数与机器学习中的离散优化
  • 金仓 KES V9 兼容 MongoDB 的运维替代思路
  • 用 frontend-design skill 提升前端生成的审美
  • MySQL 用 ON DUPLICATE KEY UPDATE 做 Upsert
  • Webhook 自动化部署实战配置
  • VNCTF 2026 Web 题解整理
  • Qwen3 30B A3B Python Coder 使用笔记
  • Ubuntu 24.04 LTS 虚拟机安装与常用配置
  • 在 Photoshop 里用 WebPShop 处理 WebP

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online