Leetcode刷题---C语言实现初阶数据结构---单链表

1 删除链表中等于给定值 val 的所有节点

删除链表中等于给定值 val 的所有节点
给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点
在这里插入图片描述
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [ ], val = 1
输出:[ ]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[ ]
思路如下
在这里插入图片描述
见详细代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode*prev=NULL;struct ListNode*cur=head;while(cur){if(cur->val==val){if(cur==head){head=cur->next;cur=head;}// head=cur->next;// cur=head;else{prev->next=cur->next;cur=prev->next;}}else{prev=cur;cur=cur->next;}// else// {//     prev->next=cur->next;//     cur=prev->next;// }}return head;
}

上述注释掉的代码是我在写的时候犯的错误,大家也可以试着自己写写看会不会和我犯同样的错误
如果有其他思路可以随意发表意见!

2 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点
给你单链表的头结点head ,请你找出并返回链表的中间结点
如果有两个中间结点,则返回第二个中间结点
在这里插入图片描述
输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为3
在这里插入图片描述
输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为3和4,返回第二个结点
思路
大部分人呢第一个想到的就是先去遍历一遍链表计算出链表的长度—然后再次遍历一遍链表找到链表的的中间结点
但是如果是在面试的时候面试官让你只能遍历一次那你应该怎么处理呢?
这里运用的是快慢指针的相对速度
这时候我们可以考虑用快慢指针来作答
在这里插入图片描述
fast走两步,slow走一步,刚好天时地利人和走到了中间结点的位置
详细代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* middleNode(struct ListNode* head){struct ListNode*slow=head;struct ListNode*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}

3 输入一个链表,输出该链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点
描述
输入一个链表,输出该链表中倒数第k个结点
示例1
输入:1,{1,2,3,4,5}
返回值:{5}
在这里插入图片描述
思路一致
这里运用的快慢指针的相对距离
解法一

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {struct ListNode* cur=pListHead;int count=0;//建立一个计数器if(pListHead==NULL)//如果链表为空,则返回空指针{return NULL;}while(cur)//循环遍历链表,求出链表的长度{cur=cur->next;count++;}if(k>0&&k<=count)//对k值的合理性进行判断{int pos=count-k;//求出循环的次数while(pos){pListHead=pListHead->next;pos--;}return pListHead;//找到就返回目标结点}return NULL;
}

解法二

//计数法 时间复杂度:0(n) 空间:O(1)
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{// write code hereif(pListHead == NULL || pListHead->next == NULL)//若链表没有结点或只有一个结点时返回(第二条件不必须){return pListHead;}int nodenums = 0;//记录总结点数(第一次遍历)int returnnums = 0;//第二次遍历(每经过一次结点,前置+1)用于排查K结点struct ListNode* cur = pListHead;while(cur != NULL)//计数遍历{nodenums++;cur = cur->next;}if(k>nodenums)//如果k>总结点数,则代表不存在这一结点,返回空{return NULL;}struct ListNode* pwe = pListHead;while(pwe != NULL)//第二次遍历,寻找倒数K点{++returnnums;//每经过一个结点就+1if(nodenums-returnnums < k)//如果结点总数减去当前结点数小于K,那么这个结点就是倒数K结点;{break;}pwe = pwe->next;}return pwe;
}

4 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在这里插入图片描述
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [ ], l2 = [ ]
输出:[ ]
示例 3:
输入:l1 = [ ], l2 = [0]
输出:[0]
思路
在这里插入图片描述
在这里插入图片描述
本质上是结构体指针的地址和成员变量next的相互赋值,这里也涉及到了链表的尾插,直接套用就可以了,前提是掌握好了链表的增删查改基本逻辑
代码演示

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){if(list1==NULL){return list2;}else if(list2==NULL){return list1;}//定义一个head和tail//head和tail最初都置为NULL//tail=tail->next//尾部插入struct ListNode*head=NULL;struct ListNode*tail=NULL;while(list1&&list2){//取小的尾部插入if(list1->val<list2->val){if(tail==NULL){head=tail=list1;//tail=tail->next;}else{tail->next=list1;tail=tail->next;}list1=list1->next;   }else{if(tail==NULL){head=tail=list2;}else{tail->next=list2;tail=tail->next;}list2=list2->next; }}if(list1){tail->next=list1;}else if(list2){tail->next=list2;}return head;
}

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

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

相关文章

基于 ThinkPHP 5.1(稳定版本) 开发wms 进销存系统源码

基于ThinkPHP 5.1&#xff08;LTS版本&#xff09;开发的WMS进销存系统源码 管理员账号密码&#xff1a;admin 一、项目简介 这个系统是一个基于ThinkPHP框架的WMS进销存系统。 二、实现功能 控制台 – 权限管理&#xff08;用户管理、角色管理、节点管理&#xff09; – 订…

Docker 入门终极指南[详细]

前言 富 Web 时代&#xff0c;应用变得越来越强大&#xff0c;与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可&#xff0c;而容器化则成为中间的必要桥梁。 本节我们就来探索一下 Docker 的神秘世界&#xff0c;从零到一掌握 Docker 的基本原理与实…

忽略nan值,沿指定轴计算标准(偏)差numpy.nanstd()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 沿指定轴方向 计算标准(偏)差 numpy.nanstd() [太阳]选择题 import numpy as np a np.array([[1,2],[np.nan,3]]) print("【显示】a ") print(a) print("【执行】np.std(a)&qu…

链表OJ题目1 (移除链表元素)

力扣&#xff08;链接放这里喽&#xff09; 先贴代码再做讲解&#xff1a; struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* cur head;struct ListNode* tail NULL;while(cur){if(cur->val val){if(cur head){head head->next…

chatGPT 学习分享:内含PPT分享下载

InstructGPT论文地址&#xff1a; Training language models to follow instructions with human feedbackchatGPT地址&#xff1a;openAI个人整理的PPT&#xff08;可编辑&#xff09;&#xff0c;下载地址&#xff1a;chatGPT学习分享PPT

java排序算法之插入排序

文章目录 &#x1f4cb;插入排序概念&#x1f4d6;实现步骤&#x1f516;代码示例 &#x1f4c8;总结 &#x1f4cb;插入排序概念 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它将数组划分为已排序和未排序两个部分&#xff0c;每次从未排序部分…

Linux 多线程并发Socket服务端的实现( 11 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

25.9 matlab里面的10中优化方法介绍—— 惩罚函数法求约束最优化问题(matlab程序)

1.简述 一、算法原理 1、问题引入 之前我们了解过的算法大部分都是无约束优化问题&#xff0c;其算法有&#xff1a;黄金分割法&#xff0c;牛顿法&#xff0c;拟牛顿法&#xff0c;共轭梯度法&#xff0c;单纯性法等。但在实际工程问题中&#xff0c;大多数优化问题都属于有约…

SpringBoot读取配置文件顺序

文章目录 一、前言二、SpringBoot配置文件目录读取顺序源码解析 三、SpringBoot配置文件类型读取顺序源码解析 一、前言 本文通过源码分析 SpringBoot 加载配置文件目录的顺序&#xff0c;以及 properties、xml、yml、yaml文件的读取顺序 二、SpringBoot配置文件目录读取顺序…

【MySQL】库的操作

废话不多说&#xff0c;直接上操作&#xff1a; 目录 一、查看数据库 二、创建数据库 2.1 数据库的字符集及校验规则 2.1.1 查看系统默认字符集 2.1.2 查看系统默认校验规则 2.1.3 查看数据库支持的字符集 2.1.4 查看数据库支持的校验规则 2.2 创建数据库时设置字符集和…

【二叉树进阶】搜索二叉树(递归+非递归两种版本详解)

文章目录 前言1. 二叉搜索树的概念2. 二叉搜索树的结构2.1 结点结构2.2 树结构 3. 插入操作&#xff08;非递归&#xff09;3.1 思路分析3.2 代码实现3.3 中序遍历&#xff08;测试用&#xff09; 4. 查找操作&#xff08;非递归&#xff09;4.1 思路分析4.2 代码实现 5. 删除操…

【设计模式】观察者设计模式解析

目录 一、观察者模式定义 二、观察者模式角色 三、观察者模式类图 四、观察者模式实例 五、观察者模式优缺点 5.1、优点 5.2、缺点 六、观察者模式应用 6.1、Spring 中观察者模式的四个角色 6.2、coding~~~~~~ 一、观察者模式定义 观察者模式(Observer Pattern)&#…

【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存(二)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训…

【框架篇】Spring Boot 日志

Spring Boot 日志 一&#xff0c;日志用途 尽管一个项目在没有日志记录的情况下可能能够正常运行&#xff0c;但是日志记录对于我们来说却是至关重要的&#xff0c;它存在以下功能&#xff1a; 1&#xff0c;故障排查和调试&#xff1a;当项目出现异常或者故障时&#xff0c;…

idea连接远程服务器上传war包文件

idea连接远程服务器&上传war包 文章目录 idea连接远程服务器&上传war包1. 连接服务器2.上传war包 1. 连接服务器 选择Tools -> Start SSH Session 添加配置 连接成功 2.上传war包 Tools -> Deployment -> Browse Remote Host 点击右侧标签&#xff0c;点击&…

gin框架内容(三)--中间件

gin框架内容&#xff08;三&#xff09;--中间件 Gin框架允许开发者在处理请求的过程中&#xff0c;加入用户自己的函数。这个函数就叫中间件&#xff0c;中间件适合处理一些公共的业务逻辑&#xff0c;比如登录认证、权限校验、数据分页、记录日志、耗时统计等 即比如&#x…

使用分布式HTTP代理爬虫实现数据抓取与分析的案例研究

在当今信息爆炸的时代&#xff0c;数据已经成为企业决策和发展的核心资源。然而&#xff0c;要获取大规模的数据并进行有效的分析是一项艰巨的任务。为了解决这一难题&#xff0c;我们进行了一项案例研究&#xff0c;通过使用分布式HTTP代理爬虫&#xff0c;实现数据抓取与分析…

华为eNSP:isis的配置

一、拓扑图 二、路由器的配置 配置接口IP AR1&#xff1a; <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthe…

【用IDEA基于Scala2.12.18开发Spark 3.4.1 项目】

目录 使用IDEA创建Spark项目设置sbt依赖创建Spark 项目结构新建Scala代码 使用IDEA创建Spark项目 打开IDEA后选址新建项目 选址sbt选项 配置JDK debug 解决方案 相关的依赖下载出问题多的话&#xff0c;可以关闭idea&#xff0c;重启再等等即可。 设置sbt依赖 将sbt…

QTday4(鼠标事件和键盘事件/QT实现连接TCP协议)

笔记 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QTcpServer>//服务器类 #include <QTcpSocket>//客户端类 #include <QMessageBox> #include <QList>//链表容器QT_BEGIN_NAMESPACE namespace Ui …