CCF-CSP备战NO.5链表
1.单向链表的构造struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {} };方式一 适合少量节点ListNode* head new ListNode(1); head-next new ListNode(2); head-next-next new ListNode(3);方式二 用数组批量构造最常用面试题标准写法ListNode* createList(const vectorint arr) { if (arr.empty()) return nullptr; ListNode* head new ListNode(arr[0]); ListNode* cur head; for (int i 1; i arr.size(); i) { cur-next new ListNode(arr[i]); cur cur-next; } return head; }调用vectorint nums {1, 2, 3, 4, 5}; ListNode* list createList(nums);方式3带头节点的哑结点dummy nodeListNode* dummy new ListNode(-1); // 值随便填 ListNode* cur dummy; for (int val : arr) { cur-next new ListNode(val); cur cur-next; } ListNode* realHead dummy-next; // 这才是真正的头 // 用完记得 delete dummy2.链表基础一、创建与销毁1. 创建节点ListNode* createNode(int val) { return new ListNode(val); }2. 根据数组创建链表ListNode* createList(const vectorint arr) { if (arr.empty()) return nullptr; ListNode* head new ListNode(arr[0]); ListNode* cur head; for (int i 1; i arr.size(); i) { cur-next new ListNode(arr[i]); cur cur-next; } return head; }3. 销毁链表防止内存泄漏void deleteList(ListNode* head) { while (head ! nullptr) { ListNode* temp head; head head-next; delete temp; } }二、遍历与查找4. 遍历链表void traverse(ListNode* head) { ListNode* cur head; while (cur ! nullptr) { cout cur-val ; cur cur-next; } cout endl; }5. 递归遍历反向打印void printReverse(ListNode* head) { if (head nullptr) return; printReverse(head-next); cout head-val ; }6. 查找某个值是否存在bool findValue(ListNode* head, int target) { ListNode* cur head; while (cur ! nullptr) { if (cur-val target) return true; cur cur-next; } return false; }7. 获取链表长度int getLength(ListNode* head) { int len 0; while (head ! nullptr) { len; head head-next; } return len; }8. 获取第k个节点k从1开始ListNode* getKthNode(ListNode* head, int k) { int count 1; while (head ! nullptr count k) { head head-next; count; } return head; // 如果k超出范围返回nullptr }三、插入操作9. 头插法ListNode* insertAtHead(ListNode* head, int val) { ListNode* newNode new ListNode(val); newNode-next head; return newNode; // 返回新的头节点 }10. 尾插法ListNode* insertAtTail(ListNode* head, int val) { ListNode* newNode new ListNode(val); if (head nullptr) return newNode; ListNode* cur head; while (cur-next ! nullptr) { cur cur-next; } cur-next newNode; return head; }11. 在指定位置插入位置从1开始ListNode* insertAtPosition(ListNode* head, int val, int pos) { if (pos 1) return insertAtHead(head, val); ListNode* newNode new ListNode(val); ListNode* cur head; // 找到第pos-1个节点 for (int i 1; i pos - 1 cur ! nullptr; i) { cur cur-next; } if (cur nullptr) { // 位置超出范围插入到尾部 return insertAtTail(head, val); } newNode-next cur-next; cur-next newNode; return head; }12. 在某个节点后面插入已知该节点void insertAfterNode(ListNode* node, int val) { if (node nullptr) return; ListNode* newNode new ListNode(val); newNode-next node-next; node-next newNode; }四、删除操作13. 删除头节点ListNode* deleteHead(ListNode* head) { if (head nullptr) return nullptr; ListNode* newHead head-next; delete head; return newHead; }14. 删除尾节点ListNode* deleteTail(ListNode* head) { if (head nullptr) return nullptr; if (head-next nullptr) { delete head; return nullptr; } ListNode* cur head; while (cur-next-next ! nullptr) { cur cur-next; } delete cur-next; cur-next nullptr; return head; }15. 删除指定值的节点只删第一个ListNode* deleteByValue(ListNode* head, int val) { if (head nullptr) return nullptr; // 如果要删除的是头节点 if (head-val val) { ListNode* newHead head-next; delete head; return newHead; } ListNode* cur head; while (cur-next ! nullptr cur-next-val ! val) { cur cur-next; } if (cur-next ! nullptr) { ListNode* toDelete cur-next; cur-next cur-next-next; delete toDelete; } return head; }16. 删除指定位置的节点位置从1开始ListNode* deleteAtPosition(ListNode* head, int pos) { if (head nullptr) return nullptr; if (pos 1) return deleteHead(head); ListNode* cur head; for (int i 1; i pos - 1 cur ! nullptr; i) { cur cur-next; } if (cur nullptr || cur-next nullptr) { return head; // 位置超出范围 } ListNode* toDelete cur-next; cur-next cur-next-next; delete toDelete; return head; }17. 删除所有值为val的节点ListNode* deleteAllByValue(ListNode* head, int val) { // 先处理头节点连续等于val的情况 while (head ! nullptr head-val val) { ListNode* temp head; head head-next; delete temp; } if (head nullptr) return nullptr; ListNode* cur head; while (cur-next ! nullptr) { if (cur-next-val val) { ListNode* temp cur-next; cur-next cur-next-next; delete temp; } else { cur cur-next; } } return head; }五、修改操作18. 修改第k个节点的值void updateValue(ListNode* head, int k, int newVal) { ListNode* node getKthNode(head, k); if (node ! nullptr) { node-val newVal; } }六、进阶操作19. 合并两个有序链表ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode dummy(0); // 哑节点 ListNode* cur dummy; while (l1 ! nullptr l2 ! nullptr) { if (l1-val l2-val) { cur-next l1; l1 l1-next; } else { cur-next l2; l2 l2-next; } cur cur-next; } cur-next (l1 ! nullptr) ? l1 : l2; return dummy.next; }20. 判断链表是否有环快慢指针bool hasCycle(ListNode* head) { ListNode* slow head; ListNode* fast head; while (fast ! nullptr fast-next ! nullptr) { slow slow-next; fast fast-next-next; if (slow fast) return true; } return false; }21. 找到环的入口节点ListNode* detectCycle(ListNode* head) { ListNode* slow head; ListNode* fast head; // 第一次相遇 while (fast ! nullptr fast-next ! nullptr) { slow slow-next; fast fast-next-next; if (slow fast) break; } if (fast nullptr || fast-next nullptr) return nullptr; // 从头开始同步移动直到相遇 slow head; while (slow ! fast) { slow slow-next; fast fast-next; } return slow; }22. 找到两个链表的交点ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) { if (headA nullptr || headB nullptr) return nullptr; ListNode* pA headA; ListNode* pB headB; while (pA ! pB) { pA (pA nullptr) ? headB : pA-next; pB (pB nullptr) ? headA : pB-next; } return pA; }23. 两两交换相邻节点ListNode* swapPairs(ListNode* head) { ListNode dummy(0); dummy.next head; ListNode* prev dummy; while (prev-next ! nullptr prev-next-next ! nullptr) { ListNode* first prev-next; ListNode* second prev-next-next; // 交换 first-next second-next; second-next first; prev-next second; prev first; } return dummy.next; }七、排序相关24. 链表归并排序ListNode* sortList(ListNode* head) { if (head nullptr || head-next nullptr) return head; // 找中点 ListNode* slow head; ListNode* fast head; ListNode* prev nullptr; while (fast ! nullptr fast-next ! nullptr) { prev slow; slow slow-next; fast fast-next-next; } prev-next nullptr; // 断开链表 // 递归排序 ListNode* left sortList(head); ListNode* right sortList(slow); return mergeTwoLists(left, right); }3.经典例题1反转链表#include bits/stdc.h using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* reverseList(ListNode* head) { ListNode* prev nullptr; ListNode* curr head; while (curr ! nullptr) { ListNode* nextTemp curr-next; curr-next prev; prev curr; curr nextTemp; } return prev; } void printList(ListNode* head) { while (head ! nullptr) { cout head-val ; head head-next; } cout endl; } int main() { // 从输入构造数组 vectorint arr; int num; while (cin num) { arr.push_back(num); } // 判断数组是否为空 if (arr.empty()) return 0; // 构造链表 ListNode* head new ListNode(arr[0]); ListNode* cur head; for (int i 1; i arr.size(); i) { cur-next new ListNode(arr[i]); cur cur-next; } ListNode* reversed reverseList(head); printList(reversed); return 0; }

相关新闻

TVA数字小脑:具身智能的物理交互革命(19)

TVA数字小脑:具身智能的物理交互革命(19)

前沿技术探索:AI智能体视觉(TVA,Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术,是集深度强化学习(DRL)、卷积神经网络(CNN…

2026/7/27 8:09:25阅读更多 →
TVA数字小脑:具身智能的物理交互革命(18)

TVA数字小脑:具身智能的物理交互革命(18)

前沿技术探索:AI智能体视觉(TVA,Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术,是集深度强化学习(DRL)、卷积神经网络(CNN…

2026/7/27 8:09:25阅读更多 →
MSO算法在柔性作业车间调度中的Matlab实现与优化

MSO算法在柔性作业车间调度中的Matlab实现与优化

1. 项目概述:MSO算法与柔性作业车间调度 柔性作业车间调度问题(Flexible Job Shop Scheduling Problem, FJSP)是制造业中一个经典且具有挑战性的优化问题。它要求在满足工序顺序约束的前提下,将多个工件的多道工序分配到多台可选的…

2026/7/27 8:09:25阅读更多 →
Wukong AICRM Docker部署全攻略:从环境准备到运维实践

Wukong AICRM Docker部署全攻略:从环境准备到运维实践

1. 先搞清楚 Wukong AICRM 和 Docker 部署的核心价值 如果你正在找一个开源的、能整合 AI 能力的客户关系管理系统,并且希望它能像标准软件一样,在几分钟内就启动并运行起来,那 Wukong AICRM 的 Docker 部署方案就值得你花时间研究一下。 它…

2026/7/27 9:36:22阅读更多 →
MySQL实战入门:从Docker环境搭建到索引事务核心原理

MySQL实战入门:从Docker环境搭建到索引事务核心原理

你有没有过这样的经历:想学 MySQL,打开教程,第一章就是“数据库发展史”,第二章是“关系型数据库理论”,第三章才开始讲安装,结果卡在环境变量配置上,然后……就没有然后了。 我们总以为学一个…

2026/7/27 9:36:22阅读更多 →
深入解析TI NHET指令集:从ACMP到ECNT的嵌入式实时控制编程实战

深入解析TI NHET指令集:从ACMP到ECNT的嵌入式实时控制编程实战

1. 项目概述在嵌入式实时控制领域,尤其是汽车电子和电机驱动这类对时序精度要求苛刻的场景,软件模拟的定时器往往力不从心。你需要一个能独立于CPU核心、以硬件速度执行复杂时序逻辑的“副驾驶”。德州仪器(TI)的高端定时器&#…

2026/7/27 9:36:22阅读更多 →
Python进阶 - map filter reduce的组合使用 简化数据处理流程

Python进阶 - map filter reduce的组合使用 简化数据处理流程

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Python进阶这个话题展开,希望能为你带来一些…

2026/7/27 9:36:22阅读更多 →
Python进阶 - reduce函数的初始值设置 影响计算结果的关键

Python进阶 - reduce函数的初始值设置 影响计算结果的关键

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Python进阶这个话题展开,希望能为你带来一些…

2026/7/27 9:36:22阅读更多 →
终极浏览器隐私防护指南:如何用uBlock Origin实现高效广告拦截与隐私保护

终极浏览器隐私防护指南:如何用uBlock Origin实现高效广告拦截与隐私保护

终极浏览器隐私防护指南:如何用uBlock Origin实现高效广告拦截与隐私保护 【免费下载链接】uBlock uBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean. 项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock uBlock Origi…

2026/7/27 9:34:22阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →