C语言每日一练(二)
单链表经典算法专题
一、 单链表相关经典算法OJ题1:移除链表元素
typedef struct ListNode ListNode;
struct ListNode* removeElements( ListNode* head, int val) {ListNode* pcur = head;ListNode* pre = head;while (pcur){while (pcur->val != val ){pre = pcur;pcur = pcur->next;if (pcur == NULL){return head;}}if (head->val == val){head = head->next;pcur = head;pre = head;}else if (pcur->val == val){pcur = pcur->next;pre->next = pcur;}}return head;
} 注意:当头节点的val==val时,要改变头节点的位置
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val){ListNode * newHead=NULL;ListNode * newTail=NULL;ListNode* pcur=head;while(pcur){if(pcur->val!=val){if(newHead==NULL){newHead=pcur;//注意这里不能写headnewTail=pcur;}else {newTail->next=pcur;newTail=newTail->next;}}pcur=pcur->next;}if(newTail){newTail->next=NULL;}return newHead;}
注意:这里如果写head的话,当一个节点是要删除的节点,头节点还是那个删除的节点。
二、单链表相关经典算法OJ题2:反转链表
typedef struct ListNode SLNode;
struct ListNode* reverseList(struct ListNode* head){SLNode* newHead = NULL;SLNode* newTail = NULL;SLNode* pcur = head;SLNode* last = head;while (head!=NULL){if (newHead == NULL){newHead = newTail = head;head = head->next;}else{last = head;head = head->next;pcur = last;pcur->next = newHead;newHead = pcur;}}if (newTail!=NULL){newTail->next = NULL;}return newHead;} 解法二:定义三个变量,n1,n2,n3(n1,n2用来反转指向,n3在前面遍历)
typedef struct ListNode ListNode;
struct ListNode* reverseList( ListNode* head) {if(head==NULL){return NULL;}ListNode * n1=NULL;ListNode * n2=head;ListNode * n3=head->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3){n3=n3->next;}}return n1;
} 三、 单链表相关经典算法OJ题3:合并两个有序链表
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
if (list1 == NULL){return list2;}if (list2 == NULL){return list1;}ListNode* pcur1 = list1;ListNode* pre =list1;ListNode* pcur2 = list2;ListNode* pcur3 = list2->next;while (pcur1 && pcur2){while (pcur1->val < pcur2->val){pre = pcur1;pcur1 = pcur1->next;if (pcur1 == NULL){pre->next = pcur2;return list1;}}if (list1->val > pcur2->val){pcur2->next = list1;list1 = pcur2;pre = list1;pcur2 = pcur3;if (pcur3 != NULL){pcur3 = pcur3->next;}}//在pur1实现头插else{pre->next = pcur2;pcur2->next = pcur1;pcur2 = pcur3;if (pcur3 != NULL){pcur3 = pcur3->next;}}}return list1;
} 输出结果:

解法二:创建一个新的空链表,遍历俩个链表,进行新链表的尾插
(使用单链表)无头单向不循环链表
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
if (list1 == NULL){return list2;}if (list2 == NULL){return list1;}ListNode* newhead=NULL;ListNode* newtail=NULL;ListNode* pcur1=list1;ListNode* pcur2=list2;while(pcur1&&pcur2){if(pcur1->val<pcur2->val){if(newhead==NULL)//插入新链表{newhead=newtail=pcur1;}else{newtail->next=pcur1;newtail=newtail->next;}pcur1=pcur1->next;}else{if(newhead==NULL)//插入新链表{newhead=newtail=pcur2;}else{newtail->next=pcur2;newtail=newtail->next;}pcur2=pcur2->next;}}if(pcur1==NULL){newtail->next=pcur2;}if(pcur2==NULL){newtail->next=pcur1;}return newhead;
}
优化解法二(使用带头单向不循环链表)
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
if (list1 == NULL){return list2;}if (list2 == NULL){return list1;}ListNode* newhead,*newtail;newhead= newtail=(ListNode*)malloc(sizeof(ListNode));ListNode* pcur1=list1;ListNode* pcur2=list2;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==NULL){newtail->next=pcur2;}if(pcur2==NULL){newtail->next=pcur1;}ListNode * rethead=newhead->next;free(newhead);newhead=NULL;return rethead;;
}
注:相比较与不带头链表,带头链表省略了反复判断头节点是否为空,直接插入头的后面,所带的头不带任何数据,所以返回的时候,返回头的next.
四、单链表相关经典算法OJ题4:链表的中间结点

解法一:使用快慢指针
//快慢指针
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head){if(head==NULL){return NULL;}ListNode * slow,*fast;slow=head;fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;}
注:这种快慢指针可以运用到寻找单链表的倒数第几个节点,比如说,找倒数第3个节点,只需要让慢指针与快指针相差3个节点,当快指针走到NULL,此时慢指针为倒数第3个节点。
还有一点值得注意的是 while(fast&&fast->next)该位置判断不能颠倒,因为可能fast为空,此时先判断fast->next会报错。
五、 循环链表经典应⽤-环形链表的约瑟夫问题

解法一:创建一个单向循环链表,遇到计数等于m的节点删除,剩下最后一个节点的val值即为所求编号
typedef struct ListNode ListNode;
ListNode * SLbuyNode(int x)//创造一个节点
{ListNode * Node=(ListNode*)malloc(sizeof(ListNode));Node->val=x;Node->next= NULL;return Node;
}
//创建一个循环链表
ListNode *CreatSLNode(int n)
{ListNode * head=SLbuyNode(1);ListNode * tail=head;for(int i=2;i<=n;i++){tail->next=SLbuyNode(i);tail=tail->next;}tail->next=head;return tail;
}int ysf(int n, int m ) {ListNode* prev=CreatSLNode(n);ListNode* pcur=prev->next;int count=1;while(pcur->next!=pcur){if(count==m)//报到m的节点删除{prev->next=pcur->next;free(pcur);pcur=prev->next;count=1;}else //没报m继续往前走{prev=pcur;pcur=pcur->next;count++;}}return pcur->val;
}
注意:红框若改成SLbuyNode(1),表示tail又重新开辟一块空间,和head不是同一片空间,所以连不起来。
六、 单链表相关经典算法OJ题5:分割链表

解法一:创建俩个带头单向不循环链表,将大于等于x和小于x的节点,分别放入俩个空链表,然后小链表和大链表头尾相接
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){if(head==NULL){return NULL;}ListNode * maxhead,*maxtail;ListNode * minhead,*mintail;maxhead= maxtail=(ListNode*)malloc(sizeof(ListNode));minhead=mintail=(ListNode*)malloc(sizeof(ListNode));ListNode *pcur=head;while(pcur){if(pcur->val<x){mintail->next=pcur;mintail=mintail->next;pcur=pcur->next;}else{maxtail->next=pcur;maxtail=maxtail->next;pcur=pcur->next;}}if(maxtail->next!=NULL){maxtail->next=NULL;}mintail->next=maxhead->next;ListNode*ret= minhead->next;free(maxhead);maxhead=NULL;free(minhead);minhead=NULL;return ret;
}
相关文章:
C语言每日一练(二)
单链表经典算法专题 一、 单链表相关经典算法OJ题1:移除链表元素 解法一:在原链表中删除Node.nextnext的节点 typedef struct ListNode ListNode; struct ListNode* removeElements( ListNode* head, int val) {ListNode* pcur head;ListNode* pre h…...
HashJoin 在 Apache Arrow 和PostgreSQL 中的实现
文章目录 背景PostgreSQL HashJoin实现PG 执行器架构HashJoin 基本流程HashJoin 实现细节Join 类型HashJoin 的划分阶段HashJoin 的分批处理阶段JOIN 类型的状态机转换HashJoin 的投影和过滤 Arrow Acero HashJoin实现Acero 基本框架HashJoin 基本流程 总结 背景 近两个月转到…...
FL Studio21.2.0.3421最新汉化破解版中文解锁下载完整版本
音乐在人们心中的地位日益增高,近几年音乐选秀的节目更是层出不穷,喜爱音乐,创作音乐的朋友们也是越来越多,音乐的类型有很多,好比古典,流行,摇滚等等。对新手友好程度基本上在首位,…...
docker在java项目中打成tar包
docker在java项目中打成tar包 1、首先安装一个docker desktop 2、mvn install项目后,建立一个自己的dockerfile 这里我以我的代码举例,from 镜像,这里你也能打包好一个镜像的基础上,from打好的镜像,这里我们用openj…...
No175.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会
How Effective Are Neural Networks for Fixing Security Vulnerabilities 写在最前面摘要贡献发现 介绍背景:漏洞修复需求和Java漏洞修复方向动机方法贡献 数据集先前的数据集和Java漏洞Benchmark数据集扩展要求数据处理工作最终数据集 VJBenchVJBench 与 Vul4J 的…...
解决国外镜像无法访问导致的R包无法安装问题
我自己的方法: install.packages("vcd", repos "https://mirrors.tuna.tsinghua.edu.cn/CRAN/") R包安装镜像设置的三种方法:R包安装镜像设置的三种方法 - 简书 更新了Rstudio后,出现 unable to access index for rep…...
【2021集创赛】Robei杯一等奖:基于Robei EDA工具的隔离病房看护机器人设计
本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位:重庆交通大学 队伍名称:一丘之貉 指导老师:毕波 李艾星 参赛队员:郁航 张坤 秦衡 总决赛奖项:Robei杯一等奖…...
Python之函数-传实参的两种方式
Python之函数-传实参的两种方式 函数参数 函数在定义是要定义好形式参数,调用时也提供足够的实际参数,一般来说,形参和实参个数要一致(可变参数除外)。实参传参方式 1、位置传参 定义时def f(x, y, z), 调用使用 f(1, 3, 5)&am…...
Hive客户端和Beeline命令行的基本使用
本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.Hive CLI 1.1 命令帮助Help 使用 `hive -H` 或者 `hive --help` 命令可以查看所有命令的帮助,显示如下: usage: hive-d,--define <key=value> Variable subsitution to ap…...
Ubuntu 22.04自动登录进入桌面
1.编辑gdm3配置文件 sudo vim /etc/gdm3/custom.conf 2.修改内容为 AutomaticLoginEnableTrue AutomaticLoginusername 3.查看和重启服务 # 查看服务状态 systemctl --user status gnome-remote-desktop.service # 重启服务 systemctl --user restart gnome-remote-deskt…...
C#__简单了解XML文档
/* XML(可扩展标记语言):用于传输和存储数据 XML文档:树结构;包含根元素 XML元素:从开始标签到结束标签的部分 XML语法规则: 1、所有XML元素都必须有结束标签 …...
云游数智农业世界,体验北斗时空智能
今日,2023年中国国际农业机械展览会在武汉正式拉开帷幕,众多与会者云集,各类农机产品纷呈,盛况空前。 千寻位置作为国家北斗地基增强系统的建设与运营方,在中国国际农业机械展览会上亮相,以「北斗时空智能 …...
C# 递归算法使用简介_常用整理
一、递归简介 递归算法是一种直接或者间接调用自身函数或者方法的算法。 递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。 递归本质是循环&a…...
[Python]unittest-单元测试
目录 unittest的大致构成: Test Fixture Test Case-测试用例 Test Suite-测试套件 Test Runner 批量执行脚本 makeSuite() TestLoader discover() 用例的执行顺序 忽略用例执行 skip skipIf skipUnless 断言 HTML测试报告 错误截图 unittest是python中的单元测…...
Jetpack:021-Jetpack中的滑动列表
文章目录 1. 概念介绍2. 使用方法2.1 函数参数2.2 列表成员 3. 示例代码4. 内容扩展5. 内容总结 我们在上一章回中介绍了Jetpack中底部导航栏相关的内容,本章回中主要介绍 滑动列表。闲话休提,让我们一起Talk Android Jetpack吧! 1. 概念介绍…...
基于单片机的空气质量检测系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、主要内容二、系统方案设计2.1 系统方案设计2.2 主控制器模块选择 三、 系统软件设计4.1 程序结构分析4.2系统程序…...
论文阅读——InstructGPT
论文:Training_language_models_to_follow_instructions_with_human_feedback.pdf (openai.com) github:GitHub - openai/following-instructions-human-feedback 将语言模型做得更大并不能从本质上使它们更好地遵循用户的意图。例如,大型语…...
【表面缺陷检测】铝型材表面缺陷检测数据集介绍(含xml标签文件)
一、铝型材介绍 铝型材是一种由铝合金材料制成的,具有固定截面形状和尺寸的条形建材。由于其优良的物理性能和广泛的应用领域,铝型材在现代工业和生活中发挥着重要的作用。 1、铝型材的分类 根据截面形状的不同,铝型材可分为角铝、槽铝、工…...
我的学习:从本科到研究生的认识与实践经验总结
学习实践经历 18年 上大学以后,因为对计算机的喜爱和对未知编程技术的好奇和探索,选择了从零开始学习程序设计,经过实践,选择了转专业到计算机科学与技术,开始了我的计算机学习之路。 19年 因为想要拓宽自己的专业能力…...
三大痛点终结!猫抓插件:颠覆式网页资源提取与管理解决方案
三大痛点终结!猫抓插件:颠覆式网页资源提取与管理解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾遇到这样的困境:在视频网站看到精彩教程想保存离…...
通义千问3-VL-Reranker-8B新手教程:零基础学会混合检索排序
通义千问3-VL-Reranker-8B新手教程:零基础学会混合检索排序 1. 认识这个强大的多模态排序工具 想象一下,你正在管理一个包含文字、图片和视频的庞大数据库。当用户搜索"户外运动装备"时,系统返回了100个结果——有些是产品描述文…...
Docker容器命名冲突的终极解决方案:删除与重命名实战指南
1. 为什么Docker容器会命名冲突? 当你第一次看到"Docker You have to remove (or rename) that container to be able to reuse that name"这个错误提示时,可能会觉得一头雾水。其实这个问题的本质很简单:就像你电脑上不能有两个同…...
Granite TimeSeries FlowState R1实战:基于卷积神经网络(CNN)的时序特征提取进阶
Granite TimeSeries FlowState R1实战:基于卷积神经网络(CNN)的时序特征提取进阶 你是不是也遇到过这样的问题?面对一长串传感器读数、股票价格波动或者服务器监控数据,感觉信息量巨大,却不知道从哪里入手…...
终极指南:5分钟上手BepInEx,打造你的Unity游戏插件帝国 [特殊字符]
终极指南:5分钟上手BepInEx,打造你的Unity游戏插件帝国 🚀 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的强…...
科研党效率翻倍:Texmaker这些隐藏功能让你的论文排版快人一步
Texmaker科研效率革命:解锁高阶玩家的12个生产力加速器 在深夜实验室的灯光下,你盯着屏幕上纠缠不清的LaTeX代码,参考文献格式突然崩溃,数学公式编号混乱不堪——这场景是否似曾相识?Texmaker作为LaTeX编辑器的隐藏冠军…...
OpenClaw压力测试:nanobot持续运行72小时稳定性
OpenClaw压力测试:nanobot持续运行72小时稳定性 1. 测试背景与目标 最近在本地部署了基于OpenClaw的nanobot项目,这是一个超轻量级的自动化助手框架。它内置了vllm部署的Qwen3-4B-Instruct-2507模型,通过chainlit提供推理界面。在实际使用中…...
从‘折半查找’到‘二分答案’:LeetCode实战中如何活用这个O(log n)的经典思想
从二分查找到二分答案:LeetCode实战中的O(log n)思想进阶指南 在算法学习与面试准备过程中,二分查找(Binary Search)往往是第一个让初学者感受到算法效率之美的经典案例。这个看似简单的"折半查找"思想,却能…...
插件管理终极指南:从入门到精通的全方位策略
插件管理终极指南:从入门到精通的全方位策略 【免费下载链接】Magpie An all-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 为什么80%的用户都没用对插件功能?在开源工具Magpie的使用过程中…...
实时手机检测-通用:5分钟快速部署,小白也能轻松上手
实时手机检测-通用:5分钟快速部署,小白也能轻松上手 1. 模型简介 实时手机检测-通用是一款基于DAMOYOLO-S框架的高性能目标检测模型,专门用于在各种场景中快速准确地检测手机设备。这个模型在精度和速度上都超越了传统的YOLO系列方法&#…...

