0

0

c++如何实现单链表的反转_c++链表逆序算法思路【实战】

冰火之心

冰火之心

发布时间:2026-03-11 13:06:12

|

154人浏览过

|

来源于php中文网

原创

三指针迭代法反转单链表最稳妥:用prev、curr、next依次推进,先保存next再修改指针,空间复杂度o(1),避免栈溢出;递归法需谨慎处理边界和断链,易因未置空head->next成环。

c++如何实现单链表的反转_c++链表逆序算法思路【实战】

用三指针迭代法反转单链表,最稳

直接上手就写递归?容易栈溢出,也难调试。C++里反转单链表,首选三指针迭代——prevcurrnext三个变量轮着换,逻辑清晰,空间复杂度 O(1),而且不依赖编译器优化。

常见错误是把 next 提前改了,导致链表断掉再也找不回后续节点:

  • 错:先执行 curr->next = prev,再取 next = curr->next → 此时 next 已经是 prev,不是原后续节点
  • 对:必须先用临时变量存好 next = curr->next,再改指针,最后推进

典型写法:

ListNode* reverseList(ListNode* head) {
    ListNode* prev = nullptr;
    ListNode* curr = head;
    while (curr != nullptr) {
        ListNode* next = curr->next;  // 先保命
        curr->next = prev;           // 再翻转
        prev = curr;                 // 推进 prev
        curr = next;                 // 推进 curr
    }
    return prev;  // 新头结点
}

递归写法能用,但得盯住边界和栈深度

递归本质是靠系统栈记住“翻转完后面,再把当前节点接在末尾”,简洁但有隐患。最常崩在空链表或单节点没处理好,或者输入太长(比如十万级节点)直接栈溢出。

立即学习C++免费学习笔记(深入)”;

关键点:

蛙蛙写作——超级AI智能写作助手
蛙蛙写作——超级AI智能写作助手

蛙蛙写作辅助AI写文,帮助获取创意灵感,提供拆书、小说转剧本、视频生成等功能,是一款功能全面的AI智能写作工具。

下载
  • 递归终止条件必须覆盖 head == nullptrhead->next == nullptr
  • 递归调用后,head->next->next = head 这句不能漏,否则链没连回来
  • head->next = nullptr 必须加,否则会成环(尤其原链表非空时)

示例:

ListNode* reverseList(ListNode* head) {
    if (!head || !head->next) return head;
    ListNode* newHead = reverseList(head->next);
    head->next->next = head;
    head->next = nullptr;
    return newHead;
}

反转前确认节点定义和内存管理方式

很多崩溃不是算法错,是 ListNode 定义不一致或手动 new/delete 混乱。比如:

  • LeetCode 默认用堆上分配的节点,你本地测试如果用栈变量(ListNode node;),反转后返回指针就是悬垂指针
  • 自己写的链表若带 std::unique_ptr,就不能直接操作 next 原始指针,得用 release()reset()
  • 反转后别忘了原 head 已失效,继续访问 head->next 是未定义行为

安全起见,统一用原始指针 + 手动管理,或全程用智能指针并严格遵循移动语义。

性能差异不大,但迭代法更容易嵌入实际工程场景

两种方法时间都是 O(n),但迭代法没有函数调用开销,也不受栈限制,在嵌入式、游戏逻辑、高频调用路径中更可靠。

如果你要反转的是带额外字段(如 sizetail 指针)的封装链表类,迭代法也更容易同步更新这些元信息;递归则需额外传参或用成员变量暂存,反而绕远。

真正容易被忽略的是:反转后,原头结点变成尾结点,它的 next 必须设为 nullptr —— 不然遍历时可能跑飞,尤其在循环检测或调试打印时突然多出一截旧链。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2023.12.29

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

494

2023.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

9

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号