【数据结构与算法】单链表的综合运用:1.合并两个有序链表 2.分割链表 3.环形链表的约瑟夫问题

【数据结构与算法】单链表的综合运用:1.合并两个有序链表 2.分割链表 3.环形链表的约瑟夫问题
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

链表是C语言数据结构的核心内容,也是算法面试的高频考点,其灵活的指针操作与逻辑构建对编程思维要求颇高。本文聚焦链表经典实操题型,从合并有序链表、分割链表到环形链表约瑟夫问题,由浅入深拆解解题思路,结合哨兵位、循环计数等实用技巧,通过清晰的算法原理与完整代码实现,帮读者吃透链表操作逻辑,夯实数据结构基础。

一、合并两个有序链表

1.1题目

链接:合并两个有序链表

在这里插入图片描述

1.2 算法原理

核心:判断大小 + 链表为插 + 建立一个哨兵位
和合并两个有序数组的思路一样,定义四个指针
newhead和newtail:新链表的头尾节点
pcur1和pcur2:分别指向两个要合并的链表的头节点
技巧:可以malloc一块空间让newhead和newtail指向这块空间,使其成为首元节点(哨兵位),这样在插入时可以免去链表为空情况的判断,最后返回新链表的下一个节点即可。
哨兵位:数值域不存储有效数据,指针域存储有效地址

1.3代码

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ typedef structListNode ListNode;structListNode*mergeTwoLists(structListNode* list1,structListNode* list2){ ListNode* newhead =(ListNode*)malloc(sizeof(ListNode)); ListNode* pcur1 = list1;; ListNode* pcur2 = list2; ListNode*newtail = newhead; newtail->next = NULL;while(pcur1 && pcur2){if(pcur1->val <= pcur2->val){ newtail->next = pcur1; newtail = newtail->next; pcur1 = pcur1->next;}else{ newtail->next = pcur2; newtail = newtail->next; pcur2 = pcur2->next;}}//为遍历完的链表直接接上新链表尾部节点if(pcur1) newtail->next = pcur1;if(pcur2) newtail->next = pcur2;return newhead->next;}

注:大家也可以free掉我们手动开辟的节点空间来养成良好的编程习惯,因为这是算法题,在程序执行完后会会自动回收笔者主要讲解思路,就不主动free但大家在写工程时不要的空间要及时释放养成良好编程习惯

二、分割链表

2.1题目

链接:分割链表

在这里插入图片描述

2.2 算法原理

创建两个新链表,list1和list2分别存放小于x和大于或等于x的节点,最后让list1的尾指针指向list2的第一个元素即可。
:list2作为新链表的后半部分,最后一个节点的next要及时置NILL,防止死循环
技巧:依旧可以使用哨兵位,并把哨兵位的next初始化为NULL可以避免合并时一条链表为空的特殊判断造成要写大量特判代码。

2.3代码

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ typedef structListNode ListNode;structListNode*partition(structListNode* head,int x){if(head == NULL)return head;//指向小于x链表的头节点 ListNode* list1 =(ListNode*)malloc(sizeof(ListNode)); ListNode* tail1 = list1;//指向大于x链表的头节点 ListNode* list2 =(ListNode*)malloc(sizeof(ListNode)); ListNode* tail2 = list2;//防止单个节点链表出现非法解引用 list1->next = NULL; list2->next = NULL; ListNode* pcur = head;while(pcur){if(pcur->val < x){ tail1->next = pcur; tail1 = tail1->next;}else{ tail2->next = pcur; tail2 = tail2->next;} pcur = pcur->next;} tail1->next = list2->next;//防止死循环 tail2->next = NULL;return list1->next;}

注:大家也可以free掉我们手动开辟的节点空间来养成良好的编程习惯,因为这是算法题,在程序执行完后会会自动回收笔者主要讲解思路,就不主动free但大家在写工程时不要的空间要及时释放养成良好编程习惯

三、环形链表的约瑟夫问题

3.1题目

链接:环形链表的约瑟夫问题

在这里插入图片描述

3.2 算法原理

核心:利用循环链表 + 循环计数
定义一个指针v指尾节点,一个指针指向头结点,利用一个变量s来循环技术,当s == m时让h指向的当前元素出队即可

在这里插入图片描述

3.3代码

typedef structListNode ListNode;//创建节点 ListNode*BuyNode(int x){ ListNode* newnode =(ListNode*)malloc(sizeof(ListNode)); newnode->val = x; newnode->next = NULL;return newnode;}//创建环形链表 ListNode*CyclicList(int n){ ListNode* head =BuyNode(1); ListNode* tail = head;for(int i =2;i <= n;i++){ tail->next =BuyNode(i); tail = tail->next;} tail->next = head;return tail;}intysf(int n,int m ){ ListNode* prev =CyclicList(n); ListNode* phead = prev->next;int count =1;//计数while(phead != prev){if(count == m){ prev->next = phead->next;free(phead); phead = prev->next; count =1;}else{ prev = phead; phead = phead->next; count++;}}return phead->val;}

总结与每日励志

✨本文系统讲解了链表操作的三大经典题型:合并有序链表通过哨兵位简化插入逻辑,分割链表采用双链表分类处理,环形链表约瑟夫问题巧妙结合循环计数。每种解法均配有清晰的算法图解和完整代码实现,帮助读者深入理解链表操作的核心逻辑与实用技巧。掌握这些题型不仅能提升面试竞争力,更能培养扎实的数据结构思维。坚持每日练习,保持对算法的热情与专注,终将在编程之路上收获成长与突破。永远相信美好的事情即将发生!

在这里插入图片描述

Read more

java入门----JDK和IDEA下载安装环境搭建保姆级教学

java入门----JDK和IDEA下载安装环境搭建保姆级教学

文章目录 * 一、初识Java * 1.1什么是Java? * 1.2为什么要学Java? * 二、JDK的下载和安装 * 2.1环境的搭建 * 2.2检测是否安装成功 * 2.3环境变量 * 三、IDEA的下载和安装 * 四、第一个java程序 * 4.1先创建一个包 * 4.2编写第一个java代码 * 五、结语 一、初识Java 1.1什么是Java? Java是一门面向对象的编程语言,由Sun公司于1995年正式发布,其设计理念源于对C 语言的改进,摒弃了多继承和指针等复杂概念,实现了功能强大与简单易用的结合。(摘自百度百科) [百科链接]https://baike.baidu.com/item/Java/85979 1.2为什么要学Java? Java是一门成熟的编程语言,java的应用领域广: 1. 大数据开发

By Ne0inhk
Java WebFlux技术在百度地图深度检索集成中的实践应用

Java WebFlux技术在百度地图深度检索集成中的实践应用

目录 前言 一、WebFlux技术简介 1、WebFlux是什么 2、WebFlux有哪些组件 3、WebFlux的使用场景 二、WebFlux集成百度深度检索 1、Maven资源引入 2、业务层实现 3、控制层实现 4、程序启动 三、成果输出及对比 1、百度深度检索输出 2、DeepSeek检索输出 3、Kimi检索输出 四、总结 前言         随着地理信息技术的飞速发展以及移动互联网的普及,地图服务已成为人们日常生活中不可或缺的一部分。从出行导航到位置查询,从周边设施搜索到地理信息分析,地图服务的应用场景日益丰富。百度地图凭借其庞大的地理数据资源、精准的定位技术和强大的检索功能,为用户提供了全方位的地理信息服务。然而,对于众多企业和开发者而言,如何将百度地图的深度检索能力与自身业务系统或应用进行高效集成,以满足用户对地理信息检索的个性化需求,是一个极具挑战性且意义重大的课题。在之前的博文中,我们对百度地图的深度检索服务进行了详细的介绍,对如何使用DeepSeek和地图的结合进行了很好的实践,智绘未来:当 DeepSeek

By Ne0inhk
飞算 JavaAI 转 SpringBoot 项目沉浸式体验:高效开发在线图书借阅平台

飞算 JavaAI 转 SpringBoot 项目沉浸式体验:高效开发在线图书借阅平台

标签#JavaAI 在软件开发领域,高效且高质量的开发工具一直是开发者们追求的目标。飞算 JavaAI 作为一款新兴的 AI 辅助开发工具,以其独特的能力为 Java 开发带来了新的可能。本次,我借助飞算 JavaAI 进行在线图书借阅平台的开发,并将其转换为 SpringBoot 项目,沉浸式体验了飞算 JavaAI 在开发流程中的便捷与高效。 一、飞算 JavaAI 操作流程:从需求到项目的顺畅之旅 飞算 JavaAI 的操作流程非常清晰且人性化,极大地简化了传统开发中从需求分析到项目构建的繁琐步骤。 首先是理解需求阶段。我将在线图书借阅平台的需求进行拆解,包括用户管理、图书资源管理、借阅管理等 8 个关键点。飞算 JavaAI 能够快速识别这些需求要点,为后续的接口设计和表结构设计奠定基础。这一步给整个项目提供了清晰的蓝图,让我对项目的整体轮廓有了明确的认识,避免了后续开发中因需求不明确而产生的反复修改。 接着进入设计接口阶段,基于之前拆解的需求,飞算 JavaAI 自动生成了

By Ne0inhk
一人手搓!AI 漫剧从0到1详细教程

一人手搓!AI 漫剧从0到1详细教程

这是苍何的第 457 篇原创! 大家好,我是喜欢看动漫的苍何。 相信不用说你也知道,我这万年没变的头像,能看出我是个二次元吧? 最近看到 AI 漫剧超级火,加上前些天朋友来公司,我们一起探讨了 AI 漫剧。 不懂没关系,可以学习啊,所以这一篇文章其实理论上是我学习的一些成果和一些经验,算是从 0 入门如何制作 AI 漫剧了。 现在的 AI 漫剧市场,说白了就是野蛮生长的爆发期。但这个阶段很快就会过去,作品积累到一定量级后,拼的就不是谁做得快了。 未来的逻辑很简单:只有精品才能跑出来。谁能沉下心做品质,谁才能真正搞定客户。 奔着这个目标,下面这个视频是我这个学习阶段的产物,哈哈哈,我觉得还是挺不错的。 然后还做了一个带穿越的视频: 第一个作为AI漫剧的学习作品,我还是非常满意的。 但其实,要想完成这样一个AI漫剧作品,需要用到AI生图、AI视频能力,需要有一个好的工具丝滑完成。 于是开始翻各家AI工具官网,发现有家AI厂商接入了🍌Pro模型。 看了下是国内AI六小龙之一MiniMax旗下的海螺AI,

By Ne0inhk