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

两两交换链表中的元素

介绍如何在 C 语言中实现链表的相邻节点两两交换。通过引入虚拟头结点简化边界处理,利用临时指针保存节点地址,在遍历过程中调整指针指向完成交换。该方法不修改节点内部数据,仅通过指针重连实现,时间复杂度为 O(n),空间复杂度为 O(1)。

锁机制发布于 2026/3/27更新于 2026/10/24100 浏览
两两交换链表中的元素

题目要求

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

图片

图片

解题思路

首先,定义一个虚拟头结点(哨兵节点),其 next 指向原链表头。这有助于处理头节点交换时的边界情况。

我们需要考虑剩余节点的奇偶性:

  1. 偶数节点:所有节点均可成对交换。
  2. 奇数节点:最后一个节点无需交换。

在单链表中,为了交换两个相邻节点(设为 A 和 B),我们需要一个指针 right 指向它们的前驱节点。如果 right 指向 A,则无法回溯到前驱连接新的头节点。因此,right 应始终指向待交换对的前一个节点。

交换完成后,right 需要向后移动两位,以便操作下一对节点(例如从 A、B 移动到 C、D)。

终止条件
  • 奇数情况:当 right->next->next == NULL 时停止,因为最后一个节点不需要交换。
  • 偶数情况:当 right->next == NULL 时停止。
指针操作细节

由于交换会改变 next 指针,导致部分节点地址丢失,需使用临时指针保存:

  1. current 保存第一个节点(A)。
  2. current1 保存第三个节点(C),即下一对的起始位置。

交换步骤:

  1. right->next 指向第二个节点(B)。
  2. right->next->next 指向第一个节点(A)。
  3. current->next 指向 current1。
  4. right 更新为 right->next->next(即新的 B 节点位置)。

完整代码

#include<stdio.h>
#include<stdlib.h>

struct Node{
     data;
    
};

 Node* {
     ( Node*)(( Node));
    (newNode == ){
        ();
         ;
    }
    newNode->data = data;
    newNode->next = ;
     newNode;
}

 {
    (head == ){
        ();
    } {
        (head != ){
            (, head->data);
            head = head->next;
        }
        ();
    }
}


 {
     *head;
    (right->next !=  && right->next->next != ){
         right->next;
         right->next->next->next;
        
        
        right->next = right->next->next;      
        right->next->next = current;          
        current->next = current1;             
        
        
        right = right->next->next;
    }
}

 {
     createNode(); 
    head->next = createNode();
    head->next->next = createNode();
    head->next->next->next = createNode();
    head->next->next->next->next = createNode();
    
    printList(head);
    changeNode(&head);
    ();
    printList(head);
     ;
}
int
struct Node* next;
struct
createNode
(int data)
struct Node* newNode =
struct
malloc
sizeof
struct
if
NULL
printf
"创建失败"
return
NULL
NULL
return
void
printList
(struct Node* head)
if
NULL
printf
"打印失败,链表为空"
else
while
NULL
printf
"%d->"
printf
"NULL"
// 两两交换链表中的节点
void
changeNode
(struct Node** head)
struct Node* right =
while
NULL
NULL
struct Node* current =
struct Node* current1 =
// 步骤 1: 调整指针完成交换
// 前驱指向第二个节点
// 第二个节点指向第一个节点
// 第一个节点指向下一对
// 移动前驱指针
int
main
()
struct Node* head =
-1
// 哨兵节点
1
2
3
4
printf
"\n"
return
0

目录

  1. 题目要求
  2. 解题思路
  3. 终止条件
  4. 指针操作细节
  5. 完整代码

更多推荐文章

查看全部
  • Python 单线程、多线程与多进程详解及代码示例
  • MCP AI Copilot 高并发场景下响应延迟瓶颈及突破方案
  • Ollama 本地大语言模型安装与部署指南
  • Visual Studio 17.14 GitHub Copilot 大模型配置指南
  • C++ STL 标准库算法详解
  • C++ priority_queue 优先级队列详解与模拟实现
  • C++ 位图与布隆过滤器:原理与实现
  • AI 产品经理转行大模型:必备素质与技能指南
  • Spring Bean 作用域、生命周期与自动装配源码解析
  • GitHub 学生认证及 PyCharm Copilot 配置流程
  • DeepFace + OpenCV 实现实时情绪分析系统
  • OSCP 实战笔记:获取并破解 Net-NTLMv2 哈希
  • Llama 3 发布,大模型开源与闭源之争的本质是什么?
  • Python 中更值得避开的 18 个写法
  • Trae IDE 结合 Figma 实现设计稿智能生成前端代码
  • 医疗 NLP 实战:电子病历分析与模型应用
  • RetinaFace 与 CurricularFace 人脸识别实战
  • 飞算 JavaAI 实战指南:用自然语言加速 Java 开发
  • 利用 AI 视觉模型优化 Unity 编辑器插件:从功能实现到界面美化
  • RustDesk 服务端完整安装部署教程

相关免费在线工具

  • 加密/解密文本

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

  • Gemini 图片去水印

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

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online