跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

两两交换链表中的节点

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

信号故障发布于 2026/3/22更新于 2026/5/817 浏览

题目描述

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

思路

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

  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(" ");
            (Integer.parseInt(s[]));
           head;
         (   ; i < s.length; i++) {
                (Integer.parseInt(s[i]));
            cur.next = node;
            cur = cur.next;
        }
           swapPairs(head);
        cur = newHead;
         (cur != ) {
            System.out.print(cur.val + );
            cur = cur.next;
        }
    }

      ListNode  {
         (head ==  || head.next == ) {
             head;
        }
            (-, head);
           dummy;
         (cur.next !=  && cur.next.next != ) {
               cur.next;
            cur.next = cur.next.next;
               cur.next.next;
            cur.next.next = first;
            first.next = second;
            cur = cur.next.next;
        }
         dummy.next;
    }
}
ListNode
head
=
new
ListNode
0
ListNode
cur
=
for
int
i
=
1
ListNode
node
=
new
ListNode
ListNode
newHead
=
while
null
" "
public
static
swapPairs
(ListNode head)
if
null
null
return
ListNode
dummy
=
new
ListNode
1
ListNode
cur
=
while
null
null
ListNode
first
=
ListNode
second
=
return

目录

  1. 题目描述
  2. 思路
  3. 执行流程
  4. 代码实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Spring Boot 整合 WebService 客户端:基于 WSDL 自动生成代码
  • JavaScript 核心技术:XSLTProcessor 类型详解
  • 2025 时序数据库选型:从架构基因到 AI 赋能
  • 飞书机器人与 Claude Code 交互:从手机指令到 AI 处理的全自动流程
  • TRAE Skills 全解析:从概念到实践
  • 基于 STM32 的智能家居安防系统设计与实现
  • 大型语言模型微调入门指南
  • C++ 图论:三种经典最短路径算法解析
  • .NET 数据操作:SqlSugar 从入门到实战
  • Linux 多线程:线程创建、等待与终止详解
  • FPGA AD7606 串行与并行驱动实现
  • OpenClaw 安装与飞书机器人接入指南
  • 支持 ChatGLM/文心一言的 API 管理镜像部署手册
  • 用 OpenAI API 格式统一调用 20+ 主流大模型
  • 2023 年值得学习的免费编程课程推荐
  • 使用 TRAE CN 将 MasterGo 设计稿转化为前端代码
  • C++分布式任务调度核心算法与高效负载均衡技术
  • 2026 年 3 月全球大模型全景:国产登顶、百万上下文与智能体爆发
  • GitHub Copilot 学生认证指南:如何申请免费 Pro 权益
  • Python 2026 年发展局势:AI 时代的通用基础设施语言

相关免费在线工具

  • 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