跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

两两交换链表中的节点

两两交换链表中的节点问题的解法。通过引入虚拟头节点简化边界处理,利用指针操作将相邻节点两两交换。核心步骤包括定位首尾节点、断开连接、重新链接以及移动指针。该方法时间复杂度为 O(n),空间复杂度为 O(1),适用于单链表结构下的节点交换场景。

信号故障发布于 2026/3/22更新于 2026/10/1993 浏览

题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的头节点。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

思路

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

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

执行流程

  1. 初始化虚拟头节点 dummy 指向 head。
  2. 定义当前指针 cur 指向 dummy。
  3. 循环判断 cur.next 和 cur.next.next 是否非空。
  4. 记录 first 为 cur.next。
  5. 更新 cur.next 为 cur.next.next(跳过 first)。
  6. 记录 second 为 cur.next.next。
  7. 将 cur.next.next 指向 first。
  8. 将 first.next 指向 second。
  9. 更新 cur 为 first(即新的 cur.next)。
  10. 重复直至链表末尾。

代码实现

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. 代码实现

更多推荐文章

查看全部
  • 基于 Java 的游戏道具交易平台管理系统设计与实现
  • 轻量级前端框架对比:Lit 与 Alpine.js 的优势与应用场景
  • 基于 Docker 部署 Ollama 与 AnythingLLM 构建本地 LLM Agent
  • ChatGPT-4o 在数学建模、论文优化与代码生成中的应用实战
  • Windows Git 安装配置指南:避坑与最佳实践
  • 基于 AI 助手的自然语言转 SQL 查询与数据库优化实践
  • iOS 开发:iOS 26 系统 UITabBar 液态玻璃效果与 WiFi SSID 获取兼容适配
  • Rokid 灵珠平台:快速搭建旅游 AR 智能体实战
  • 使用 MCPHost 命令行工具与大模型及外部工具交互
  • AI 代码助手横评:CodeGeex、RooCode 与 GitHub Copilot
  • Welford 算法:海量数据均值与方差的流式计算
  • 【前端实战】多进制奇偶校验检查器(HTML+CSS+JS)完整实现,附源码
  • 次模函数(Submodular Function)概念与 AI 应用
  • 数据结构:哈希表原理与 C 语言实现
  • Cosmos-Reason1-7B 实战:工业巡检设备异常动作识别
  • Clawdbot 源码部署全实测:从环境搭建到 WebChat 验证
  • 前端防抖与节流:原理、区别与实战示例
  • 群晖 NAS 搭建 Nastool 影音库及 cpolar 远程访问实践
  • OpenClaw Session 机制详解:重置、压缩、剪枝与记忆管理
  • 前端实现视频画中画功能 - 主页面与小窗同步控制

相关免费在线工具

  • 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