1. 链表基础概念与训练目标链表(Linked List)作为数据结构中的重要组成部分是算法训练中必须掌握的经典内容。与数组不同链表通过指针将零散的内存块串联起来每个节点(Node)包含数据域和指针域。这种非连续存储特性使得链表在插入、删除操作上具有O(1)时间复杂度优势但牺牲了随机访问能力。今日训练重点包含单链表基本操作实现虚拟头节点(dummy node)技巧双指针法的典型应用场景链表常见问题解决模式2. 单链表操作核心实现2.1 节点结构与初始化链表的基础是节点定义以C为例struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} };关键细节构造函数初始化列表写法可避免二次赋值新节点next指针必须初始化为nullptr建议使用有参构造函数保证节点完整性2.2 链表基本操作时间复杂度对比操作数组链表随机访问O(1)O(n)头部插入O(n)O(1)尾部插入O(1)O(n)中间插入O(n)O(1)*元素删除O(n)O(1)**注已知前驱节点情况下3. 虚拟头节点技巧实战3.1 为什么需要dummy node处理链表头节点变更时如删除头节点引入dummy node可统一操作逻辑ListNode* removeElements(ListNode* head, int val) { ListNode dummy(0); dummy.next head; ListNode* cur dummy; while(cur-next) { if(cur-next-val val) { ListNode* tmp cur-next; cur-next cur-next-next; delete tmp; } else { cur cur-next; } } return dummy.next; }3.2 边界条件处理要点空链表情况dummy.next初始化为nullptr连续匹配节点删除后不立即移动指针内存管理C中需手动释放删除的节点4. 双指针法经典问题4.1 环形链表检测LeetCode 141快慢指针解法bool hasCycle(ListNode *head) { ListNode *slow head, *fast head; while(fast fast-next) { slow slow-next; fast fast-next-next; if(slow fast) return true; } return false; }4.2 寻找链表中点LeetCode 876快指针走两步慢指针走一步ListNode* middleNode(ListNode* head) { ListNode *slow head, *fast head; while(fast fast-next) { slow slow-next; fast fast-next-next; } return slow; }4.3 双指针法的变种应用倒数第k个节点快指针先走k步相交链表指针交替遍历两个链表回文链表中点反转后半部分5. 链表反转的多种实现5.1 迭代法标准实现ListNode* reverseList(ListNode* head) { ListNode *prev nullptr, *cur head; while(cur) { ListNode *next cur-next; cur-next prev; prev cur; cur next; } return prev; }5.2 递归法实现ListNode* reverseList(ListNode* head) { if(!head || !head-next) return head; ListNode *newHead reverseList(head-next); head-next-next head; head-next nullptr; return newHead; }5.3 反转区间链表LeetCode 92ListNode* reverseBetween(ListNode* head, int left, int right) { ListNode dummy(0); dummy.next head; ListNode *pre dummy; for(int i0; ileft-1; i) pre pre-next; ListNode *cur pre-next; for(int i0; iright-left; i) { ListNode *tmp cur-next; cur-next tmp-next; tmp-next pre-next; pre-next tmp; } return dummy.next; }6. 链表问题调试技巧6.1 可视化调试方法打印链表函数实现void printList(ListNode* head) { while(head) { cout head-val; if(head-next) cout -; head head-next; } cout endl; }图形化表示原始链表1-2-3-4-5 反转后5-4-3-2-16.2 常见错误排查指针丢失在修改next前保存后续节点循环引用特别注意反转链表时的指针处理边界条件头节点、尾节点、空链表等特殊情况7. 工程实践中的链表优化7.1 内存池技术频繁的节点创建/销毁会影响性能可预先分配节点池class ListNodePool { vectorListNode pool; int index; public: ListNodePool(int size) : pool(size), index(0) {} ListNode* newNode(int val) { if(index pool.size()) return nullptr; pool[index].val val; pool[index].next nullptr; return pool[index]; } void reset() { index 0; } };7.2 线程安全考虑读写锁保护链表结构原子操作保证指针修改安全避免多线程同时修改相邻节点8. 链表与其他数据结构的结合8.1 跳表(Skip List)Redis有序集合的实现方式通过多级索引加速查找第3层1 ---------------- 9 第2层1 ------ 5 ------ 9 第1层1 - 3 - 5 - 7 - 98.2 块状链表结合数组和链表的优点每个节点存储多个元素struct Block { vectorint data; Block *next; int size; };9. 算法竞赛中的链表技巧9.1 离线处理技巧处理大量查询时可先记录操作再批量执行收集所有插入/删除操作按位置排序后统一处理减少实际链表修改次数9.2 哈希链表结合LRU缓存算法的经典实现class LRUCache { unordered_mapint, listpairint,int::iterator cache; listpairint,int recent; int capacity; public: LRUCache(int capacity) : capacity(capacity) {} int get(int key) { if(!cache.count(key)) return -1; auto it cache[key]; recent.splice(recent.begin(), recent, it); return it-second; } void put(int key, int value) { if(cache.count(key)) { auto it cache[key]; it-second value; recent.splice(recent.begin(), recent, it); return; } if(cache.size() capacity) { cache.erase(recent.back().first); recent.pop_back(); } recent.emplace_front(key, value); cache[key] recent.begin(); } };10. 链表训练进阶路线基础阶段掌握单链表CRUD操作提高阶段双指针、反转、合并等经典问题精通阶段复杂链表问题与工程实践结合扩展学习研究Linux内核链表实现等工业级应用关键提示链表问题的核心在于指针操作建议在纸上画出节点关系图后再编写代码可显著降低出错概率。对于递归解法要明确递归终止条件和每层递归的处理逻辑。
企业数字化 ERP 产品动态
相关推荐
前端教程文档汇总:从资源清单到学习系统的组织逻辑与维护机制 前端教程文档汇总这件事,我前前后后折腾过好几轮。最早是自己学的时候到处收藏链接,后来带人、做分享、给团队做知识库,才发现“把教程堆在一起”和“做一份真正能用的文档汇总”完全是两码事。前者是收藏夹,后者是知识资产。这份… · 2026/11/3 14:54:08
COSCon‘25女性开源论坛:技术多元化与包容性实践 1. 项目背景与意义解析COSCon25女性开源论坛作为中国开源年会(COSCon)的重要平行论坛,已经走过了十个年头。这个持续十年的技术社区倡议,正在以独特的方式重塑着科技行业的性别格局。从最初的几十人小型聚会到如今成为开源领域最具… · 2026/11/3 14:54:08
开源商业化论坛:从技术到产品的成功路径 1. 开源商业化论坛的价值与意义 开源项目从最初的极客玩具到如今成为全球科技基础设施的核心组成部分,已经走过了漫长的道路。但如何让开源项目实现可持续发展,始终是摆在所有开源贡献者面前的难题。商业化不是开源的对立面,而是确保开源项目… · 2026/11/3 14:54:08
计算1!+ 2!+ 3! + 4! +···+10!(1到10的阶乘) //初始化
int i 0;
int j 1;
int ret 1;
int sum 0;
//嵌套for循环
for (i 0; i < 10; i) //累计1到10
{for (j 1; j < i; j) //每次数的阶乘{ret ret * j;}sum sum ret; //计算每个数的阶乘相加
}
printf("%d", sum);int i 1;
int ret 1;
int sum … · 2026/11/4 1:45:00
WinRAR /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 1:45:00
Windows快捷键的定义 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 1:45:00
Hermes Agent 容器镜像瘦身实践:轻松加速部署 Hermes Agent 容器镜像瘦身实践:轻松加速部署
第一次把 Hermes Agent 跑进容器的人,多半卡在同一个地方:容器镜像太大,docker pull 要等好几分钟,CI 冷构建动辄十几分钟,容器冷启动慢得让人怀疑人生。这篇… · 2026/11/4 1:45:00
Geckium 是如何在 Firefox 上复刻老 Chrome 的?CSS+JS 换肤核心实现原理详解 【免费下载链接】Geckium Chrome 1 - 58 theme for Firefox 115 项目地址: https://gitcode.com/gh_mirrors/ge/Geckium 点击查看 免费下载 Geckium 是一款专为 Firefox 115 打造的换肤改造方案,它通过 CSS 样式注入与 JS 动态修改 DOM 的组合方式&… · 2026/11/4 1:45:00
在 VS Code 里跑起 OpenChamber:AI 编程助手从安装、实战到排错的完整指南 在 VS Code 里跑起 OpenChamber:AI 编程助手从安装、实战到排错的完整指南 【免费下载链接】openchamber Agentic Development Environment based on OpenCode AI agent 项目地址: https://gitcode.com/gh_mirrors/op/openchamber
OpenChamber 的 VS Code 扩展把 OpenCo… · 2026/11/4 1:44:00
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46