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

LeetCode 206:反转链表核心思路与 C++ 实现

针对 LeetCode 第 206 题反转链表,提供两种主流解法。一是原地修改指针指向,遍历过程中将当前节点指向前驱;二是利用头插法,将原节点依次插入新链表头部。两者均满足时间复杂度 O(n)、空间复杂度 O(1) 的要求。文中还分析了常见错误点,如未保存后继节点导致链表断裂,并给出了无需单独判断空链表的优化写法。适合准备面试或巩固链表基础的同学参考。

黑客帝国发布于 2026/3/26更新于 2026/9/1069 浏览
LeetCode 206:反转链表核心思路与 C++ 实现

LeetCode 206:反转链表

题目描述

给定单链表的头节点 head,要求反转原链表并返回反转后的头指针。进阶要求时间复杂度为 O(n),空间复杂度为 O(1)。

反转链表示例

反转链表示例

解题思路

方法一:原地反转指针

核心逻辑:遍历一遍链表,将当前结点的 next 指针指向其前驱节点。最终返回原链表的尾结点(即新链表的头结点)。

关键点:

  • 需要保存三个指针:当前节点 curNode、前驱节点 curPrev、后继节点 curNext。
  • 在修改 curNode->next 之前,必须先记录 curNode->next 给 curNext,否则链表会断开。
  • 初始时 curPrev 为 nullptr,因为新链表的尾部指向空。

注意:在 while 循环内保存 curNext,能保证 curNode 不为空,避免对空指针解引用,代码更健壮。

原地反转指针过程

方法二:头插法构建新链表

核心逻辑:创建一个新链表,头结点 newHead 初始为 nullptr。遍历原链表,将原链表中的节点依次'头插'到新链表中。

操作细节:

  • 同样需要 curNext 暂存后继节点,防止头插后丢失后续连接。
  • 每次将 curNode->next 指向当前的 newHead,然后更新 newHead = curNode。
  • 最终返回 newHead。

头插法过程

代码实现

1. 原地反转(推荐)

这是最经典的写法,无需额外空间,直接修改原链表结构。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* curNode = head;
        ListNode* curPrev = nullptr;
        
        while (curNode) {
            // 在循环内保存 curNext,保证 curNode 一定不为空
            ListNode* curNext = curNode->next;
            
            // 反转指针指向
            curNode->next = curPrev;
            
            // 移动指针
            curPrev = curNode;
            curNode = curNext;
        }
        return curPrev;
    }
};

优化提示:上述代码已足够简洁。无需单独判断 head == nullptr,因为若为空,while 循环不执行,直接返回初始值 nullptr 即可。

2. 头插法

这种方法相当于把旧链表的节点一个个摘下来,插到新链表头部。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* newHead = nullptr;
        ListNode* curNode = head;
        
        while (curNode) {
            // 提前保存下一个结点
            ListNode* curNext = curNode->next;
            
            // 头插操作
            curNode->next = newHead;
            newHead = curNode;
            
            // 向后移动
            curNode = curNext;
        }
        return newHead;
    }
};
3. 常见误区

初次尝试时,容易忽略保存后继节点,导致链表断裂。

错误示例:

// 错误原因:第一次头插后,链表直接断开了,curNode 无法移动到下一个结点
while (curNode) {
    if (newHead == nullptr) {
        newHead = curNode;
        newHead->next = nullptr;
    } else {
        curNode->next = newHead;
        newHead = curNode;
    }
    // 这里错了!此时 curNode->next 已经被改写了
    curNode = curNode->next; 
}

修正:务必在修改指针前,先备份 curNode->next 到临时变量中。

总结

两种方法的时间复杂度均为 O(n),空间复杂度均为 O(1)。原地反转法更节省内存且逻辑直观,面试中更为常用。掌握指针操作的关键在于理清'谁指向谁',并在修改前做好备份。

目录

  1. LeetCode 206:反转链表
  2. 题目描述
  3. 解题思路
  4. 方法一:原地反转指针
  5. 方法二:头插法构建新链表
  6. 代码实现
  7. 1. 原地反转(推荐)
  8. 2. 头插法
  9. 3. 常见误区
  10. 总结

更多推荐文章

查看全部
  • 利用 Kotlin 扩展函数优雅处理网络异常详解
  • BK7258 接入 LiveKit WebRTC:端侧适配实践
  • GESP C++ 一级考试全流程及编程题核心模板
  • 双指针算法实战:盛最多水的容器与有效三角形个数
  • LeetCode Hot 100 精选:C 语言实现与思路解析(1-21)
  • Flutter+OpenHarmony 智能家居开发:多设备验证、BUG 修复与打包发布流程
  • 无人机航拍图像处理:目标跟踪与场景重建
  • Java 常见面试题及答案汇总
  • Spring AI 实战:Spring Boot + DeepSeek 工具函数 Function Call 应用
  • Cursor 代理配置教程:快速设置网络环境
  • VS Code 实时显示代码作者与 Git 插件配置技巧
  • 无人机植物病害检测数据集:1500张标注航拍图像
  • 自主无人机搭建实战:硬件选型与 EGOPlanner 部署
  • Python 快速参考手册
  • C++ 异常机制详解:从原理到工程实践
  • 软件研发中的任务分解与需求管理
  • Go 语言快速入门与核心知识点总结
  • 异构算力部署通义万相 2.1 文生图技术解析
  • C++ 核心面试题与底层原理详解
  • C++ 堆数据结构原理与实现详解

相关免费在线工具

  • 加密/解密文本

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