新闻中心

C++如何反转链表_C++单链表反转算法的递归与非递归实现

2025-12-04
浏览次数:
返回列表
反转链表可通过迭代和递归实现。迭代法用三个指针逐个翻转,时间O(n)空间O(1);递归法利用栈回溯处理后续节点,逻辑清晰但空间O(n),易栈溢出。生产环境推荐迭代,学习递归思想可用递归。

c++如何反转链表_c++单链表反转算法的递归与非递归实现

反转链表是C++数据结构中的经典问题,常用于面试和实际开发中。单链表由于其单向性,反转操作需要调整每个节点的指针方向。下面介绍两种常用方法:非递归(迭代)和递归实现。

非递归方式反转链表

使用三个指针分别指向当前节点、前一个节点和下一个节点,逐个翻转指针方向。

核心思路:从头节点开始,将每个节点的 next 指向前驱节点,直到遍历完整个链表。

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};
<p>ListNode<em> reverseList(ListNode</em> head) {
ListNode<em> prev = nullptr;   // 前一个节点
ListNode</em> curr = head;      // 当前节点
while (curr != nullptr) {
ListNode* nextTemp = curr->next;  // 临时保存下一个节点
curr->next = prev;                // 反转指针
prev = curr;                      // 移动 prev
curr = nextTemp;                  // 移动 curr
}
return prev;  // 新的头节点
}</p>

该方法时间复杂度为 O(n),空间复杂度为 O(1),效率高且稳定。

递归方式反转链表

利用函数调用栈回溯的特性,在递归到底后逐层反转指针。

Health AI健康云开放平台 Health AI健康云开放平台

专注于健康医疗垂直领域的AI技术开放平台

Health AI健康云开放平台 113 查看详情 Health AI健康云开放平台

关键点:假设当前节点之后的所有节点已经反转完成,只需处理当前节点与后续节点的关系。

ListNode* reverseListRecursive(ListNode* head) {
    // 终止条件:空节点或只有一个节点
    if (head == nullptr || head->next == nullptr) {
        return head;
    }
    // 递归反转后面的节点
    ListNode* newHead = reverseListRecursive(head->next);
    // 让后一个节点指向当前节点
    head->next->next = head;
    // 当前节点的 next 置为空,防止成环
    head->next = nullptr;
    return newHead;  // 返回新的头节点
}

递归写法简洁,但会消耗 O(n) 的栈空间,对于极长链表可能引发栈溢出。

两种方法对比与使用建议

  • 迭代法更安全,适合生产环境,尤其在链表较长时优先选用
  • 递归法逻辑清晰,适合理解递归思想,但在性能要求高或资源受限场景慎用
  • 两者时间复杂度均为 O(n),但空间开销不同

基本上就这些。掌握这两种写法有助于深入理解指针操作和递归机制。

以上就是C++如何反转链表_C++单链表反转算法的递归与非递归实现的详细内容,更多请关注其它相关文章!


# 文件系统  # 信阳关键词排名技术系统  # 网站运行优化报告范文  # 大连网站广告推广  # 临朐店铺推广招聘网站  # seo优化解决问题  # 辽宁网站建设制作开发  # seo平台佳选  # 互联网上的网站推广方法  # 高校团委网站建设策划  # 网站平台系统建设方案  # 法利  # c++  # 绑定  # 迭代  # 两种  # 与非  # 数据结构  # 如何使用  # 链表  # 递归  #   # node  # 链表反转 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  韩剧圈正版入口页面_韩剧圈官网登录链接  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  Tabulator表格中精确实现日期时间排序的指南  React Hooks最佳实践:动态组件状态管理的组件化方案  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  Angular Material 垂直步进器:实现底部到顶部排序的教程  PHP 枚举:根据字符串获取枚举案例的策略与实现  steam官方入口大全 steam账号注册及操作指南  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  夸克AO3官网入口_AO3镜像网站2025推荐  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  小米汽车11月交付量突破40000台!雷军:将继续努力  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  优化大型XML文件解析:基于Python流式处理的内存高效方案  qq游戏大厅官方下载_qq游戏免费下载安装入口  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  html5 app怎么运行环境_配html5 app运行环境【教程】  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  微信商城在哪里打开【步骤】  AO3官方在线访问地址 Archive of Our Own最新镜像合集  蛙漫2台版漫画地址 Manwa2正版网页版链接  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  J*aScript Promise链中如何正确终止后续.then执行并处理错误  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  12306选座怎么选到商务座_12306商务座选择与配置说明  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  b站赚钱渠道_b站收益来源  京东单号查询入口_京东快递订单追踪入口  J*a应用程序首次运行自动创建文件与目录的最佳实践  创客贴用户入口官网登录 创客贴网页版电脑版系统  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  学习通网页版官方登录 超星学习通电脑端入口指南  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  Golang如何使用net/url解析URL_Golang URL解析与处理方法  Win11怎么关闭快速启动_Win11彻底关机设置教程 

搜索