0

0

C++如何实现单向链表的快速排序_C++链表指针交换算法详解【面试】

尼克

尼克

发布时间:2026-02-12 19:26:03

|

830人浏览过

|

来源于php中文网

原创

不能直接套用数组快排的partition逻辑,因为单向链表无法随机访问和反向遍历,强行模拟会导致o(n²)时间复杂度及边界错误;正确做法是用三路划分+哑节点仅遍历一次完成归类,并严格处理断链与拼接。

c++如何实现单向链表的快速排序_c++链表指针交换算法详解【面试】

为什么不能直接套用数组快排的 partition 逻辑

数组快排依赖随机访问(arr[i]),而单向链表只能从头逐个遍历。若强行模拟“取中位数”或“双向扫描交换”,会因无法反向移动指针导致时间退化为 O(n²),且边界判断极易出错。

关键约束:只能用 next 指针前进,没有 prev;每次比较和移动都需额外遍历,必须避免重复扫描。

  • 错误做法:在 partition 中反复从 head 往后找第 k 个节点——单次 partition 就变成 O(n²)
  • 正确思路:用「三路划分」代替传统双路,只做一次遍历完成小于/等于/大于基准的归类
  • 基准选法建议固定用头节点值(head->val),避免为找中位数额外遍历

如何用三个哑节点完成一趟 partition(无内存分配)

不 new 节点、不复制数据,仅重连指针。用三个哑节点分别收集小于、等于、大于基准的节点:

ListNode dummy_lt(0), dummy_eq(0), dummy_gt(0);
ListNode *lt = &dummy_lt, *eq = &dummy_eq, *gt = &dummy_gt;

遍历原链表时,把每个节点摘下后挂到对应哑节点尾部,最后拼接:lt->next = dummy_eq.next; eq->next = dummy_gt.next;

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

  • 注意:必须保存 next 指针再移动当前节点,否则链断裂:ListNode* next = cur->next; cur->next = nullptr;
  • 拼接前要确保各段末尾为 nullptr,否则可能成环(尤其 dummy_gt 段为空时)
  • 返回时跳过哑节点:return dummy_lt.next ? dummy_lt.next : (dummy_eq.next ? dummy_eq.next : dummy_gt.next);

递归边界与断链处理的关键细节

单向链表无法像数组那样靠索引切分,必须显式断开子链首尾。常见崩溃点是忘记置空最后一个节点的 next,导致子链仍连着后续无关节点。

  • 递归前必须分离三段:获取 lt_taileq_tailgt_tail,并设 lt_tail->next = eq_tail->next = gt_tail->next = nullptr;
  • 空链表或单节点直接返回,但要注意:单节点时 eq 段有值,ltgt 均为空,此时不能对空段递归
  • 递归调用应只传非空段的头节点:sortList(dummy_lt.next),而非 &dummy_lt

面试时最容易被追问的性能与稳定性问题

这个实现平均 O(n log n),但最坏仍是 O(n²)(已排序链表选头为基准)。稳定?否——相同值节点的相对顺序在 eq 段内保持,但 ltgt 段来自不同原始位置,整体不稳定。

  • 优化方向:随机选基准需先遍历计数再随机跳转,代价高;改用「中位数的中位数」过于复杂,面试中提一句即可
  • 空间复杂度是 O(log n)(递归栈),不是 O(1);若要求 O(1) 空间,得改写为迭代+模拟栈,极难且非常规
  • 真正容易翻车的是:没处理空指针解引用(如 head->next 前未判 head 是否为空)、拼接后忘记返回新头节点

链表快排的核心不在“快”,而在“如何用有限指针操作规避随机访问缺陷”。每一步断链、挂载、拼接,都得盯着 next 指针的归属和生命周期。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

410

2023.07.18

堆和栈区别
堆和栈区别

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

587

2023.08.10

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

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

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

443

2023.08.14

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

5

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

2

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

52

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

8

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

3

2026.02.12

热门下载

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

精品课程

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

共94课时 | 9.3万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.4万人学习

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

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