C语言简单的数据结构:单链表的有关算法题(2)

题目:

  • 4. 单链表相关经典算法OJ题3:合并两个有序链表
  • 5. 循环链表经典应⽤-环形链表的约瑟夫问题
  • 6. 单链表相关经典算法OJ题5:分割链表

接着我们介绍后面的三道题,虽然代码变多了但我们的思路更加通顺了

4. 单链表相关经典算法OJ题3:合并两个有序链表

题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/
在这里插入图片描述
创建新链表,遍历原链表,将节点值小的进行尾插到新链表中
在这里插入图片描述
这里要多次进行对NULL的判断,开始传入列表,中间newHead的判断,循环出来一个为NULL的判断
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重复原因:新链表存在空链表和非空两种情况
优化的方法:
1.将重复的部分封装成一个函数
2.动态申请一个空间但这个空间部存储任何的信息
那么我们着重讲一下第二个方法:
在这里插入图片描述

他的解决方法就是让新链表不为NULL
在创建时动态申请一块空间,但不存储任何数据,让NULL节点变为非NULL的节点,这是就不用判断链表是不是为非NULL
在这里插入图片描述
在这里插入图片描述

但这时返回就不能将头节点直接返回,而是要将头节点的下一个位置的地址返回
在这里插入图片描述
当然释放的空间还是要释放一下,来使代码更加完善
在这里插入图片描述

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {ListNode* l1 = list1;ListNode* l2 = list2;//判空if(list1 == NULL){return list2;}if(list2 == NULL){return list1;}ListNode* newHead,*newTail;//newHead = newTail = NULL;newHead = newTail = (ListNode*)malloc(sizeof(ListNode));while(l1 && l2){if(l1->val < l2->val){newTail->next = l1;newTail = newTail->next;l1 = l1->next;}else{newTail->next = l2;newTail = newTail->next;l2 = l2->next;}}//跳出循环有两种情况if(l2 != NULL){newTail->next = l2;}if(l1 != NULL){newTail->next = l1;}ListNode* ret = newHead->next;free(newHead);newHead = NULL;return ret;
}

其实这样的链表叫带头链表,这个“头”一般称作哨兵位

5. 循环链表经典应⽤-环形链表的约瑟夫问题

题目链接:https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a
在这里插入图片描述
思路一:用数组的方法,先进行遍历然后将离开的人置为0,然后不断循环遍历最中不为0的就是我们要的数据
思路二:循环链表的方法
我们先介绍一下循环链表:
在这里插入图片描述
这里涉及到循环链表,其实也就是单链表但是尾部相连了
那么在创建和删除时要多注意就行了
在这里插入图片描述
循环数数,将数到2的,将其删除
在这里插入图片描述

这里就要使用前后指针
在这里插入图片描述
代码的难点就是创建循环链表

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @param m int整型 * @return int整型*/#include <stdio.h>
typedef struct ListNode ListNode ;ListNode* buyNode(int x)//申请空间{ListNode* node = (ListNode*)malloc(sizeof(ListNode));if(node == NULL){exit(1);}node->val = x;node->next = NULL;return node;}ListNode* createCircle(int n)//创建带环链表{//创建第一个节点ListNode* phead = buyNode(1);ListNode* ptail = phead;for(int i = 2; i <= n;i++){ptail->next = buyNode(i);ptail = ptail->next;}ptail->next = phead;return ptail;}
int ysf(int n, int m ) {// write code hereListNode* prev = createCircle(n);ListNode* pcur = prev->next;int count = 1;while (prev->next != pcur)//链表只有一个节点 {if(count == m){//销毁,先连接,在销毁prev->next = pcur->next;free(pcur);pcur = prev->next;count = 1;}else {prev = pcur;pcur = pcur->next;count++;}}return pcur->val;
}

6. 单链表相关经典算法OJ题5:分割链表

题目链接:https://leetcode.cn/problems/partition-list-lcci/description/
在这里插入图片描述
在这里插入图片描述
思路一:将原列表复制一份,然后对大于等于x的进行操作,先尾插后销毁
在这里插入图片描述
思路二:或者创建一个新链表进行存储,对大于的数进行尾插,小于的进行头插
在这里插入图片描述
思路三:创建两个新链表:小链表和大链表
在这里插入图片描述
分成两个链表然后将两个链表连接起来
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就是greaterHead后的指针不为NULL,而是一个随机地址
在这里插入图片描述
将两个代码换过来,就可以解决这个问题了
在这里插入图片描述

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){if(head == NULL){return head;}ListNode* lessHead,*lessTail;ListNode* greaterHead,*greaterTail;lessHead = lessTail =(ListNode*)malloc(sizeof(ListNode));greaterHead = greaterTail =(ListNode*)malloc(sizeof(ListNode));//遍历原链表,进行尾插ListNode* pcur = head;while(pcur){if(pcur->val < x){//小链表lessTail->next = pcur;lessTail = lessTail->next;}else{greaterTail->next =pcur;greaterTail = greaterTail->next;}pcur = pcur->next;}//首尾相连greaterTail->next = NULL;lessTail->next = greaterHead->next;ListNode* ret = lessHead->next;free(lessHead);free(greaterHead);lessHead = greaterHead = NULL;return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/816493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年MathorCup数学应用挑战赛C题思路分析(妈妈杯)

2024年第十四届MathorCup数学应用挑战赛C题解析 文章目录 题目概览第一问&#xff1a;货量预测第二问&#xff1a;运输线路变化的预测第三问&#xff1a;单目标优化第四问&#xff1a;排班计划的优化 MATLAB代码框架货量预测人员排班 2024年的MathorCup数学应用挑战赛再次为我…

基于物理原理的p-GaN HEMT动态导通电阻SPICE建模

来源&#xff1a;Physics-Based SPICE Modeling of Dynamic ON-State Resistance of p-GaN HEMTs&#xff08;TPEL 23年&#xff09; 摘要 这封快报介绍了一种新型基于物理学原理的SPICE建模方法&#xff0c;专门针对氮化镓基p型门极高电子迁移率晶体管&#xff08;p-GaN HEM…

【学习笔记十五】批次管理和容量管理

一、批次管理 1.配置 SAP EWM 特定参数 激活仓库的批次管理 2.ERP端物料需要启用批次管理 3.EWM物料需要启用批次管理 一般是ERP启用批次管理&#xff0c;相关的配置也会传输到EWM系统 4.建立批次主数据 5.创建采购订单并创建内向交货单&#xff0c;维护批次 6.维护产品主数…

【VS2019】x64 Native Tools Command Prompt for Vs 2019使用conda命令进入环境

【VS2019】x64 Native Tools Command Prompt for Vs 2019使用conda命令进入环境 安装完VS2019后&#xff0c;打开终端x64 Native Tools Command Prompt for Vs 2019&#xff0c;直接运行conda会出现‘conda’ 不是内部或外部命令&#xff0c;也不是可运行的程序 原因分析&am…

Lua脚本使用手册(Redis篇)

Lua脚本 **简介&#xff1a;**Lua是一种功能强大的&#xff0c;高效&#xff0c;轻量级&#xff0c;可嵌入的脚本语言。它是动态类型语言&#xff0c;通过使用基于寄存器的虚拟机解释字节码运行&#xff0c;并具有增量垃圾收集的自动内存管理&#xff0c;是配置&#xff0c;脚…

MySQL详细使用

1.安装 官网下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 2.配置 添加环境变量 验证是否添加成功 cmd管理员身份打开&#xff0c;输入mysql&#xff08;如下为成功&#xff09; 初始化MySQL 以管理员身份运行cmd 输入 mysqld --ini…

【已开源】​基于stm32f103的爬墙小车

​基于stm32f103的遥控器无线控制爬墙小车&#xff0c;实现功能为可平衡在竖直墙面上&#xff0c;并进行移动和转向&#xff0c;具有超声波防撞功能。 直接上&#xff1a; 演示视频如&#xff1a;哔哩哔哩】 https://b23.tv/BzVTymO 项目说明&#xff1a; 在这个项目中&…

数模 线性规划模型理论与实践

线性规划模型理论与实践 1.1 线性规划问题 在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支一数学规划&#xff0c;而线性规划(Linear Programming 简记LP)则是数学规划的一个…

架构师系列-搜索引擎ElasticSearch(五)- 索引设计

索引创建后&#xff0c;要非常谨慎&#xff0c;创建不好后面会出现各种问题。 索引设计的重要性 索引创建后&#xff0c;索引分片只能通过_split和_shrink 接口对其进行成倍的增加和缩减。 ES的数据是通过_routing分配到各个分片上的&#xff0c;所以本质上不推荐区改变索引的…

AI克隆语音(基于GPT-SoVITS)

概述 使用GPT-SoVITS训练声音模型&#xff0c;实现文本转语音功能。可以模拟出语气&#xff0c;语速。如果数据质量足够高&#xff0c;可以达到非常相似的结果。相比于So-VITS-SVC需要的显卡配置更低&#xff0c;数据集更小&#xff08;我的笔记本NVIDIA GeForce RTX 4050 Lap…

智能水务系统:构建高效节水的城市水网

随着城市化进程的加速和人民生活水平的提高&#xff0c;对水务管理的需求也越来越高。传统的水务管理方式已经无法满足现代社会的需求&#xff0c;而智能水务系统的出现为水务管理带来了新的变革。本文将从项目背景、需求分析、建设目标、建设内容、技术方案、安全设计等方面&a…

网络篇06 | 应用层 自定义协议

网络篇06 | 应用层 自定义协议 01 固定协议设计&#xff08;简化版&#xff09;1&#xff09;总体设计2&#xff09;值设计 02 可变协议设计&#xff08;进阶版&#xff09;1&#xff09;固定头&#xff08;Fixed Header&#xff09;2&#xff09;可变头&#xff08;Variable H…

UBuntu18.04通过ODBC连接MySQL远程数据库

今天在做一个Qt视频播放器的小项目然后想要在ubuntu18.04运行这个项目&#xff0c;需要在Qt中连接远程的MySQL数据库&#xff0c;所以用到了ODBC。我在连接时遇到了一些问题&#xff0c;加之网上的教程各说纷纭&#xff0c;所以我花了很多时间去解决&#xff0c;所以决定做做笔…

数据资产与数据要素的重要性及数据资产入表的实践指南

## 引言在当今快速发展的数字化时代&#xff0c;数据资产已经成为企业最宝贵的资源之一。数据资产不仅对企业的运营决策有着至关重要的影响&#xff0c;而且在企业的财务健康和市场竞争力方面扮演着核心角色。数据要素&#xff0c;作为构成数据资产的基本单元&#xff0c;其管理…

【opencv】示例-stiching_detailed.cpp 使用OpenCV进行图像拼接的整体流程

#include <iostream> // 引入输入输出流库 #include <fstream> // 引入文件流库&#xff0c;用于文件输入输出 #include <string> // 引入字符串库 #include "opencv2/opencv_modules.hpp" // 引入OpenCV模块 #include <opencv2/core/utility.h…

2023年看雪安全技术峰会(公开)PPT合集(11份)

2023年看雪安全技术峰会&#xff08;公开&#xff09;PPT合集&#xff0c;共11份&#xff0c;供大家学习参阅。 1、MaginotDNS攻击&#xff1a;绕过DNS 缓存防御的马奇诺防线 2、从形式逻辑计算到神经计算&#xff1a;针对LLM角色扮演攻击的威胁分析以及防御实践 3、TheDog、0…

Mac 软件清单

~自留备用~ Macbook用了几年之后, 512G的内置硬盘有些紧张了, 这几天总是提示空间不足, 就重装了下系统, 重装之后竟然不记得有些软件的名字和下载链接, 特此记录 Office 办公套件 直接从微软官网下载Office 安装包https://officecdnmac.microsoft.com/pr/C1297A47-86C4-4C1F…

Kafka 简单介绍

目录 一 消息队列&#xff08;MQ&#xff09; 1&#xff0c;为什么需要消息队列&#xff08;MQ 2&#xff0c;常见的 MQ 中间件 3&#xff0c;MQ 传统应用场景之异步处理 4&#xff0c;使用消息队列的好处 5&#xff0c;消息队列的两种模式 5.1点对点模式&#xf…

车载电子电器架构 —— 平行开发策略

车载电子电器架构 —— 平行开发策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

Jmeter配置服务器监控插件

1.安装插件管理器 插件官网地址&#xff1a;JMeter Plugins :: JMeter-Plugins.org 点击 Plugins Manager,如上图所示&#xff0c; &#xff0c;点击jar file下载“plugins-manager.jar”&#xff0c;下载后放到“jmeter\lib\ext”目录下&#xff0c;重启jmeter。 2.安装资源…