1.链表逆序代码**#includestdio.h#includestdlib.htypedefstructNode{intdata;structNode*next;}Node;structNode*reverseList(Node*head){Node*preNULL;Node*curhead;Node*nextNULL;while(cur!NULL){nextcur-next;cur-nextpre;precur;curnext;}returnpre;}Node*CreateNode(intval){Node*NewNode(Node*)malloc(sizeof(Node));NewNode-dataval;NewNode-nextNULL;returnNewNode;}Node*CreateList(intarr[],intn){if(n0)returnNULL;Node*headCreateNode(arr[0]);Node*tailhead;for(inti1;in;i){tail-nextCreateNode(arr[i]);tailtail-next;}returnhead;}voidprintList(Node*head){Node*phead;while(p!NULL){printf(%d,p-data);pp-next;}printf(\n);}intmain(){intarr[]{1,2,3,4,5};intnsizeof(arr)/sizeof(arr[0]);Node*headCreateList(arr,n);printf(原链表:);printList(head);printf(现链表:);headreverseList(head);printList(head);}逆序过程:初始链表1 - 2 - 3 -4 -5 - NULLpreNULLcur1next 保存 21 的 next 指向 pre (NULL)pre1cur2next 保存 32 的 next 指向 1pre2cur3next 保存 43 的 next 指向 2pre3cur4next 保存 54 的 next 指向 3pre4cur5next 保存 NULL5 的 next 指向 4pre5curNULL循环结束返回 pre5新头节点反转后5-4-3-2-1-NULL2.判断链表是否成环#includestdio.h#includestdlib.htypedefstructNode{intdata;structNode*next;}Node;inthasCycle(Node*head){if(headNULL||head-nextNULL)return0;Node*slowhead;Node*fasthead;while(fast!NULLfast-next!NULL){slowslow-next;fastfast-next-next;if(slowfast){return1;}}return0;}Node*CreateNode(intval){Node*NewNode(Node*)malloc(sizeof(Node));NewNode-dataval;NewNode-nextNULL;returnNewNode;}Node*CreateList(intarr[],intn){if(n0)returnNULL;Node*headCreateNode(arr[0]);Node*tailhead;for(inti1;in;i){tail-nextCreateNode(arr[i]);tailtail-next;}returnhead;}通过快慢指针是否相遇判断是否有环;3.数组与单链表的区别数组顺序表内存连续一块空间依靠下标偏移量访问元素。单链表内存分散节点分散在堆中靠指针next串联没有下标。数组:优点:支持随机访问按下标直接取元素查找速度快连续内存缓存命中率高访问效率高结构简单没有指针额外占用内存。缺点:容量固定需要提前分配空间在中间插入、删除元素需要移动后面所有元素效率低容易出现空间浪费开辟大数组只用一部分链表优点:动态分配内存节点按需创建没有固定容量限制已知位置时插入、删除只修改指针不需要移动元素不会预留多余空间。缺点:不能随机访问查找元素必须从头节点开始遍历每个节点要额外存储指针next有额外空间开销连续内存差缓存效果差查找指定位置元素时间复杂度 (O(n))。4.栈和队列的区别以及两者的业务使用场景栈Stack后进先出 LIFO只能在同一端栈顶进行插入入栈和删除出栈。队列Queue先进先出 FIFO在队尾插入队头删除两端操作。栈适用场景递归调用、括号匹配、撤销操作、表达式计算。队列适用场景任务排队、广度优先遍历、消息队列、打印任务调度。5.链表的排序代码#includestdio.h#includestdlib.htypedefstructNode{intdata;structNode*next;}Node;Node*CreateNode(intval){Node*NewNode(Node*)malloc(sizeof(Node));NewNode-dataval;NewNode-nextNULL;returnNewNode;}Node*CreateList(intarr[],intn){if(n0)returnNULL;Node*headCreateNode(arr[0]);Node*tailhead;for(inti1;in;i){tail-nextCreateNode(arr[i]);tailtail-next;}returnhead;}Node*findMid(Node*head){Node*slowhead;Node*fasthead-next;while(fast!NULLfast-next!NULL){slowslow-next;fastfast-next-next;}returnslow;}Node*merge(Node*left,Node*right){Node dummy;Node*pdummy;dummy.nextNULL;while(left!NULLright!NULL){if(left-dataright-data){p-nextleft-data;leftleft-next;}else{p-nextright-data;rightright-next;}pp-next;}p-nextleft?left:right;returndummy.next;}Node*MergeSortList(Node*head){if(headNULL||head-nextNULL)returnhead;Node*midfindMid(head);Node*rightHeadmid-next;mid-nextNULL;Node*leftMergeSortList(head);Node*rightMergeSortList(rightHead);returnmerge(left,right);}fast 初始化为 head-next目的偶数节点时slow 停在左中点方便切分merge函数中注意:left?left:right通过条件把两个长短不一致的链表接到一起举个例子:left 链表1 - 3 - 5right 链表2 - 4 - 6 - 7 - 8循环过程依次比较 1,2,3,4,5把它们接到结果链。循环结束left NULLleft 已经用完right还剩6-7-8。执行p-next left ? left : right;left 是 NULL所以p-next right直接把6-7-8整条接上。反过来left1-3-5-9-10right2-4循环结束right NULLleft 剩余9-10直接接上。MergeSortList函数要注意:mid-next NULL如果不断开递归时还是整条链表会无限递归死循环完整流程举例:原始链表4 - 2 - 7 - 1 - 3第一次切分4,2,7和1,3递归切左半段4,2,7→4,2和7递归切4,2→4和2两个单节点触发递归出口merge(4,2) →2-4merge(2-4,7) →2-4-7递归切右半段1,3→1和3merge 得到1-3最后 merge (2-4-7,1-3) →1-2-3-4-76.编写快排或其它高性能排序算法的代码并描述时间复杂度与空间复杂度以及稳定性#includestdio.hvoidswap(int*a,int*b){inttmp*a;*a*b;*btmp;}intpartition(intarr[],intleft,intright){intpivotarr[left];intileft,jright;while(ij){while(ijarr[j]pivot)j--;while(ijarr[i]pivot)i;swap(arr[i],arr[j]);}swap(arr[left],arr[i]);returni;}voidquickSort(intarr[],intleft,intright){if(leftright)return;intpospartition(arr,left,right);quickSort(arr,left,pos-1);quickSort(arr,pos1,right);}intmain(){intarr[]{5,3,8,6,2,9,1,7,4};intnsizeof(arr)/sizeof(arr[0]);quickSort(arr,0,n-1);for(inti0;in;i){printf(%d ,arr[i]);}return0;}使用刚才代码里的 partition基准 pivot arr[left]左右指针 i、j示例数组arr [5, 3, 8, 6, 2, 9, 1, 7, 4]本次调用left0right8pivot arr[0] 5i 初始 0j 初始 8j 先往左走找小于 pivot 的元素遇到就停下i 再往右走找大于 pivot 的元素遇到就停下如果 ij交换 arr [i] 和 arr [j]循环直到 ij交换 arr [left] 和 arr [i]把基准值放到正确位置返回 i主要作用为返回基准值的下标,便于后一步递归函数的使用.时间复杂度空间来自递归调用栈平均情况(O(n\log n))每次划分把数组分成大致两半递归深度(\log n)每层总比较次数n。最好情况(O(n\log n))每次 pivot 刚好把数组均等分割。最坏情况(O(n^2))数组已经有序 / 逆序每次划分一边只有 1 个元素递归深度n。*不稳定排序相等元素相对位置会被打乱7.二分法查找代码#includestdio.hintbinarySearch(intarr[],intn,inttarget){intleft0;intrightn-1;intmid;while(leftright){intmid(leftright)/2;if(arr[mid]target){returnmid;}elseif(arr[mid]target){leftmid1;}else{rightmid-1;}}return-1;}这个方法只能用于有序数列(数组),不能用于链表.8.合并有序链表代码编写#includestdio.h#includestdlib.htypedefstructNode{intdata;structNode*next;}Node;Node*CreateNode(intval){Node*p(Node*)malloc(sizeof(Node));p-dataval;p-nextNULL;returnp;}Node*mergeList(Node*L1,Node*L2){Node*dummyCreateNode(-1);Node*taildummy;while(L1!NULLL2!NULL){if(L1-dataL2-data){tail-nextL1;L1L1-next;}else{tail-nextL2;L2L2-next;}tailtail-next;}if(L1!NULL)tail-nextL1;elsetail-nextL2;Node*resdummy-next;free(dummy);returnres;}哨兵头结点dummy)尾指针依次比较两个链表当前节点把小的接入结果链表,真正的头结点是dummy-next.
企业数字化 ERP 产品动态
相关推荐
仲夏CMS | 建站这件事,本来不该这么累 想做自己的网站,第一步通常不是写作,是"配环境"。装运行时、配数据库、拉依赖、改配置文件、解决端口占用……等你把这些忙完,最初想写的那点东西,早没了兴致。我们把这套流程里最烦的部分,直接砍掉了。仲夏… · 2026/9/25 18:56:39
AI深入芯片与行业数据链:从运行AI到芯片即AI的范式重构 1. 这不是概念炒作,而是芯片与数据链正在发生的底层重构“AI 深入芯片与行业数据链”——这八个字不是科技媒体惯用的模糊修辞,而是我过去三年在半导体设计公司、工业物联网平台和金融风控系统三类一线场景中反复验证的真实路径。它指的不是把AI模型跑在… · 2026/9/25 18:56:32
SAP + AI 第3节 PS3大对象一些典型注解 SAP AI 第3节 PS3大对象一些典型注解PS模块三大CDS对象进阶知识点(逐项讲解源文件对照版)知识点1:WBS层级结构机制知识点2:状态管理机制知识点3:延期/逾期天数计算知识点4:货币、单位、数量、日历、文本等… · 2026/9/25 18:56:26
从Excel到自托管CRM:DeskcommCRM部署实战与踩坑记录 从去年开始,我们团队一直在用 Excel 加微信群管客户,客户一多就彻底乱套了。销售说找不到历史跟进记录,客服说客户在微信上问他问题,他根本分不清是哪条线索,我这边想汇总一个成交漏斗,得让运营手动导出三四… · 2026/9/25 19:22:16
小白程序员也能抓住的AI大模型红利,高薪就业指南! 文章指出AI岗位需求全面爆发,月薪70K的AI岗位随处可见,各行各业都在抢AI人才。AI大模型开发工程师等岗位的平均薪资比同类传统开发岗高出10%-30%。文章强调AI开发门槛没有想象中高,普通人经过系统实战学习也能胜任
最近刷招聘软件,… · 2026/9/25 19:22:16
小白/程序员必看:轻松入门大模型,中小企业AI落地“小快轻准”新思路 本文探讨中小企业AI落地的“三缺”困境(缺人才、缺算力、缺数据),并介绍工信部《“小快轻准”数字化产品和服务培育指引》如何通过小型化、快速化、轻量化、精准化四大维度破解难题。文章提出模型量化、边缘部署、场景化微调三条技术路径&… · 2026/9/25 19:22:03
Linux进程间通信(四).命名管道 一.何谓命名管道?二.如何创建命名管道文件?1.命名管道可以从命令⾏上创建,命令⾏⽅法是使⽤下⾯这个命令:$ mkfifo filename2.命名管道也可以从程序⾥创建,相关函数有:int mkfifo(const char *filename,mod… · 2026/9/25 19:21:57
分页语句使用row_number引发的性能问题 背景
今天给客户优化时发现客户在使用了分页语句中使用了row_number而引发了性能问题
那客户是怎样使用row_number引发了性能问题
在分页语句中如何处理
我们来模拟实验下
模拟
这了减少复杂度,我们用单表查询来模拟客户性能问题场景
使用row_number获取排序序号
or… · 2026/9/25 19:20:57
CLI 错误诊断模式与详细日志转储 CLI 错误诊断模式与详细日志转储开源 CLI 工具上线后,最让人抓狂的反馈莫过于 GitHub Issue 里只有一句冷冰冰的报错:“运行报错了,怎么解决?”附带的截图可能只截取了控制台最后一行没有任何上下文的 Error: Request failed with… · 2026/9/25 19:20:45
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37