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

单链表反转算法详解:LeetCode 206 题深度解析

单链表反转是算法基础中的经典问题,以 LeetCode 206 题为例,详细解析了使用三指针法迭代反转链表的实现过程。通过维护 pre、current 和 next 三个指针,逐步改变节点指向关系,在 O(n) 时间复杂度和 O(1) 空间复杂度下完成操作。文中包含边界条件处理、代码关键点解析及性能分析表格,并延伸讨论了部分反转、K 个一组反转等变式问题,帮助读者掌握指针操作精髓。

咸鱼开飞机发布于 2026/3/23更新于 2026/10/781 浏览
单链表反转算法详解:LeetCode 206 题深度解析

🎨 链表反转的艺术

🧠 算法思路图解

原始链表

1 --> 2 --> 3 --> 4 --> 5 --> NULL

反转过程

NULL <-- 1 2 --> 3 --> 4 --> 5

NULL <-- 1 <-- 2 3 --> 4 --> 5

NULL <-- 1 <-- 2 <-- 3 4 --> 5

NULL <-- 1 <-- 2 <-- 3 <-- 4 5

NULL <-- 1 <-- 2 <-- 3 <-- 4 <-- 5

图表说明:展示了链表从原始状态逐步被反转的全过程,每一步都清晰地显示了已反转部分和未反转部分的分界

🔍 核心思想三指针法

反转链表的核心在于三指针技巧,这就像三位默契的舞伴,各司其职又相互配合:

  1. Pre 指针:始终指向已反转部分的头节点,初始为 NULL
  2. Current 指针:指向待反转部分的头节点,初始为原链表头
  3. Next 指针:临时保存 current 的下一个节点,防止链表断裂

💻 代码实现详解

下面让我们用 C++ 来实现这一优雅的算法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 边界条件处理:空链表或单节点链表直接返回
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        ListNode* pre = nullptr;       // 已反转部分的头节点
        ListNode* current = head;      // 待反转部分的头节点
        ListNode* p = nullptr;         // 临时指针
        while (current != nullptr) {
            p = current->next;         // 保存下一个节点
            current->next = pre;       // 反转当前节点
            pre = current;             // pre 前移
            current = p;               // current 前移
        }
        return pre;                    // 最终 pre 就是新链表的头节点
    }
};

📝 代码关键点解析

  1. 边界处理:首先检查链表是否为空或只有一个节点,这些情况无需反转
  2. 指针初始化:三个指针各就各位,准备开始'舞蹈'
  3. 循环反转:每一步都精心安排三个指针的移动,确保链表不会断裂
  4. 返回值:最终 pre 指针指向的就是反转后的新链表头

🏆 性能分析

让我们用表格来清晰展示算法的性能表现:

指标数值/描述说明
时间复杂度O(n)只需遍历链表一次
空间复杂度O(1)只使用了固定数量的指针变量
稳定性稳定不改变相同值节点的相对顺序
适用性单链表不适用于双向链表等复杂结构

🌈 变式与扩展

掌握了基础的反转方法后,我们可以挑战一些有趣的变式问题:

  1. 反转链表的一部分(LeetCode 92 题)
  2. K 个一组反转链表(LeetCode 25 题)
  3. 回文链表判断(LeetCode 234 题)

💡 总结与思考

链表反转看似简单,却蕴含着指针操作的深刻原理。通过三指针的优雅舞蹈,我们实现了链表的完美转身。记住:

  • 始终明确每个指针的职责
  • 注意保存下一个节点的引用,防止链表断裂
  • 边界条件的处理同样重要

目录

  1. 🎨 链表反转的艺术
  2. 🧠 算法思路图解
  3. 🔍 核心思想三指针法
  4. 💻 代码实现详解
  5. 📝 代码关键点解析
  6. 🏆 性能分析
  7. 🌈 变式与扩展
  8. 💡 总结与思考

更多推荐文章

查看全部
  • NLP 与计算机视觉融合实战:从原理到图像字幕生成
  • GPT4ALL 本地部署大模型实战指南
  • Web 应用架构与安全漏洞基础学习
  • 基于 LangChain 实现数据库问答机器人
  • Java 使用 Jedis 连接 Redis 6 实战指南
  • AIGC 时代的网络安全威胁与应急响应机制构建
  • 爬虫代理IP原理、类型与实战配置指南
  • Java 代码性能优化的 11 个实用技巧
  • GraalVM for JDK 快速上手指南
  • 数据结构:二叉树经典习题讲解
  • 通义万相 2.1 文生视频模型部署与硬件性能实测
  • Java 处理 JSON 的实战技巧与最佳实践
  • Coze 工作流一键生成“葬经人”风格动画(含提示词)
  • Python 面向对象学生管理系统设计与实现
  • Arduino BLDC 基于 6.5 寸轮毂电机的智能动态跟随机器人底盘
  • Snipe-IT开源IT资产管理系统部署与配置指南
  • Java hashCode 方法的作用与重写规范
  • SpringBoot 整合 Langchain4j 实现会话记忆存储深度解析
  • 在 Cursor 中配置并使用 MCP 服务指南
  • 金仓 SQL 防火墙的体系化安全实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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