【数据结构】单链表OJ题(一)

🔥博客主页: 小羊失眠啦.
🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》
❤️感谢大家点赞👍收藏⭐评论✍️

文章目录
- 前言
- 一、移除链表元素
- 二、寻找链表中间结点
- 三、输出链表倒数第k个结点
- 四、反转单链表
- 五、合并两个有序链表
前言
在上一期中我们介绍了单链表,也对单链表的实现进行具体的了解,接下来我们开始单链表的练习,对单链表更深层的理解,让小伙伴们灵活的使用单链表,话不多说,开造~
一、移除链表元素

💭方法一:
我们使用两个指针遍历数组,遇到与 val 相同的结点时,就删除这个节点。我们在思考问题时要想全面,当要删除头节点时,常规方法就无法实现,对于删除头节点要做单独处理。
常规删除:

头节点删除:

思路:(1)首先给出判断cur是否是空的,不是空的之后,判断是否有val,有的话就判断是否在头部,是的话一种情况,不是的话,又是一种情况。(2)第一种情况,题意所给出的情况;第二种情况,中间连续个value(前两种可以合并);第三种情况,一开始就出现6或者连续个6;第四种情况:空的
struct ListNode* removeElements(struct ListNode* head, int val)
{if (head == NULL)return head;struct ListNode* prev = NULL, * cur = head;while (cur){struct ListNode* Next = cur->next;if (cur->val == val){if (prev == NULL){head = Next;cur = Next;}else{prev->next = Next;free(cur);cur = Next;}}else{prev = cur;cur = Next;}}return head;
}
💭方法二:
我们通过遍历,把节点的数据域不等于val的节点尾接到新的链表中。我们要考虑第一个节点是不是要删除的。最后一个节点的指针域置空要放在循环结束后,判断tail是否为空指针。

truct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* newnode=NULL;struct ListNode* cur=head,*tail=newnode;while(cur){if(cur->val!=val){if(tail==NULL){newnode=cur;tail=newnode;}else{tail->next=cur;tail=tail->next;}cur=cur->next;}else{struct ListNode* del=cur;cur=cur->next;free(del);}}if(tail){tail->next=NULL;}return newnode;
}
二、寻找链表中间结点

我们可以定义两个指针,快指针一次走两步,慢指针一次走一步,当快指针走到结尾时,慢指针正好走了一半,这样我们就可以找到中间节点。

struct ListNode* middleNode(struct ListNode* head)
{struct ListNode* slow=head,*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}
三、输出链表倒数第k个结点

我们可以参考上一题的方法,同样定义快慢指针,先让快指针走k步,然后再同时走,走到fast为空指针就找了倒数第k个节点。有可能链表没有k个节点,所以我们要加入判断。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {struct ListNode* slow=pListHead,*fast=pListHead;while(k--){if(fast==NULL){return NULL;}fast=fast->next;}while(fast){slow=slow->next;fast=fast->next;}return slow;
}
四、反转单链表

💭方法一:
我们定义三个指针n1,n2,n3,来改变节点链接的顺序。将头节点变为尾节点,当n2为空指针时,n1就为链表的头节点,只需返回n1就可以。两个指针倒方向,一个指针保持下一个。
struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1=NULL,*n2=head,*n3=NULL;if(head==NULL)return head;while(n2){n3=n2->next;n2->next=n1;n1=n2;n2=n3;}return n1;
}
💭方法二:
将链表的节点一个一个拿下来,进行头插。这里要注意赋值的顺序。

struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* cur=head;struct ListNode* newnode=NULL;while(cur){//保存节点struct ListNode* next=cur->next;//头插cur->next=newnode;newnode=cur;cur=next;}return newnode;
}
五、合并两个有序链表

思路:每次取小的节点尾插到新的节点
注意:其中一个为空的情况要注意
💭代码一:(不带头)
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{if(list1==NULL)return list2;if(list2==NULL)return list1;struct ListNode* head=NULL;struct ListNode* tail=NULL;while(list1&&list2){if((list1->val) < (list2->val)){if(tail==NULL){head=list1;tail=list1;}else{tail->next=list1;tail=list1;}list1=list1->next;}else{if(tail==NULL){head=list2;tail=list2;}else{tail->next=list2;tail=list2;}list2=list2->next;}}if(list1)tail->next=list1;if(list2)tail->next=list2;return head;
}
有头单链表:head->next指的是第一个节点的地址(带头,相当于开头多了一个节点,但是节点里面的val不确定,next指向下一个节点); 无头单链表:head指的是第一个节点的地址; OJ题默认不带头
💭代码二:(带头)
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));//创建一个头struct ListNode* tail = head;head->next = NULL;//就是含有值的节点的第一个while (list1 && list2){struct ListNode* next1 = list1->next;struct ListNode* next2 = list2->next;if ((list1->val) < (list2->val)){tail->next = list1;tail = list1;list1 = next1;}else{tail->next = list2;tail = list2;list2 = next2;}}if (list1 != NULL){tail->next = list1;}if (list2 != NULL){tail->next = list2;}struct ListNode* list = head->next;free(head);return list;
}
思路:每次取小的节点尾插到新的节点
注意:mallloc的一个地址,到最后要进行释放。
本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位铁汁们的支持。文章有任何问题可以在评论区留言,小羊一定认真修改,写出更好的文章~~

相关文章:
【数据结构】单链表OJ题(一)
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 前言一、移除链表元素二、寻找链表中间结点三、输出链表倒数第k个结点四、反转单链表五…...
2023年云计算发展趋势浅析
云计算的概念 云计算是一种通过互联网提供计算资源和服务的模式。它允许用户通过网络访问和使用共享的计算资源,而无需拥有或管理这些资源的物理设备。云计算的核心理念是将计算能力、存储资源和应用程序提供给用户,以便随时随地根据需要…...
[极客大挑战 2019]Http1
打开题目 没有发现什么,我们查看源代码 在这里我们发现了提示 访问一下页面得到 提示说不能来自于https://Sycsecret.buuoj.cn,我们尝试访问一下这个url 发现访问不了 我们bp抓包一下 伪造个referer头 referer:https://Sycsecret.buuoj.cn 发包过去…...
C 语言 for循环
C 语言 for循环 在本教程中,您将借助示例学习在C语言编程中创建for循环。 在编程中,循环用于重复代码块,直到满足指定条件为止。 C语言编程具有三种循环类型: for 循环while 循环do… while 循环 我们将在本教程中学习for循环…...
浅谈数据结构之链表
链表是一种灵活的数据结构,有单向链表、双向链表和循环链表等多种形式。在本文中,我们将深入探讨单向链表、双向链表、循环链表的定义、Java实现方式、使用场景,同时比较它们的不同之处。我们还会介绍链表与队列之间的区别。 单向链表 定义…...
封装一个 虚拟列表渲染 组件
组件代码 <template><div ref"list" class"infinite-list-container" scroll"scrollEvent($event)"><div class"infinite-list-phantom" :style"{ height: listHeight px }"></div><div class…...
Spring中@Bean标注的方法是如何创建对象呢?
Bean 标注的方法如何创建对象呢? 参考文章:https://blog.csdn.net/qq_35971258/article/details/128241353 下边只讲一下 Bean 注解标注的方法,是如何去进行创建 bean,以及流程是怎样的,如果需要看源码具体执行流程&a…...
伦敦金股票代码是什么?
伦敦金是跟踪实时的现货黄金价格走势的差价合约交易,它的代码一般是LLG、GOLD,但也有一些货币交易平台会显示为XAU。伦敦金不是股票交易,因此没有四位数或六位数的股票代码,但伦敦金交易品种单一,投资者不用在数千支股…...
【环境装配】Anaconda在启动时闪现黑框,闪几次后仍能正常使用,解决黑框问题
anaconda闪黑框这个问题遇到好久了,也没找到相关资料来解决,今天做了两个更新,刚好可以不闪黑框了,记录一下。 更新anaconda 在界面右上角的位置点击更新,更新完后再打开时只闪现两个黑框了,之前好像有五…...
【Python】Python爬虫使用代理IP的实现
前言 在爬虫的过程中,我们经常会遇到需要使用代理IP的情况。比如,针对目标网站的反爬机制,需要通过使用代理IP来规避风险。因此,本文主要介绍如何在Python爬虫中使用代理IP。 一、代理IP的作用 代理IP,顾名思义&…...
盘点U-Mail邮件系统安全设计
在当今社会,电子邮件已经成企业沟通和信息传递重要的手段之一,是企业办公中不可或缺的一部分。但是由于企业邮件服务器端口对外开放、企业邮件安全管理能力不足、邮件内容敏感性高等特点,电子邮件也成为了网络攻击者进行网络钓鱼、恶意软件传…...
Webpack--动态 import 原理及源码分析
前言 在平时的开发中,我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import(),那 webpack 是如何实现 import() polyfill 的? 原理分析 我们先来看看下面的 demo function component() {const btn docume…...
创新无处不在的便利体验——基于智能视频和语音技术的安防监控系统EasyCVR
随着科技的迅猛发展,基于智能视频和语音技术的EasyCVR智能安防监控系统正以惊人的速度改变我们的生活。EasyCVR通过结合先进的视频分析、人工智能和大数据技术,为用户提供了更加智能、便利的安全保护体验,大大提升了安全性和便利性。本文将介…...
强化IP地址管理措施:确保网络安全与高效性
IP地址管理是网络安全和性能管理的关键组成部分。有效的IP地址管理可以帮助企业确保网络的可用性、安全性和高效性。本文将介绍一些强化IP地址管理的关键措施,以帮助企业提高其网络的安全性和效率。 1. IP地址规划 良好的IP地址规划是强化IP地址管理的基础。它涉及…...
Power Automate-创建审批流
提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表,再点击添加新步骤 搜索审批,点击进入 操作里的选项区别: 1)创建审批:创建一个审批任务 2)等待审批&…...
商越科技:渗透测试保障平台安全,推动线上采购高效运转
商越科技是数字化采购解决方案提供商,在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台,帮助企业实现采购数字化以及智能化转型,提高工作效率、降低采购成本。 打造数字…...
Java10新增特性
特性列表 Java 10是Java的一个主要版本更新,引入了许多新功能和改进。以下是一些Java 10的新增特性: 局部变量类型推断:Java 10引入了局部变量类型推断,允许开发者使用关键字"var"来声明局部变量,而无需指定…...
Hive 知识点八股文记录 ——(一)特性
Hive通俗的特性 结构化数据文件变为数据库表sql查询功能sql语句转化为MR运行建立在hadoop的数据仓库基础架构使用hadoop的HDFS存储文件实时性较差(应用于海量数据)存储、计算能力容易拓展(源于Hadoop) 支持这些特性的架构 CLI&…...
如何使用PHP替换回车为br
1、使用PHP内置的nl2br()函数 nl2br()函数是PHP内置的函数,可以将任何字符串中的回车符(\n)替换为HTML中的换行符(br)。具体使用方法如下: $string "这里有一个\n换行符"; $string nl2br($str…...
Unity 场景优化策略
Unity 场景优化策略 GPU instancing 使用GPU Instancing可以将多个网格相同、材质相同、材质属性可以不同的物体合并为一个批次,从而减少Draw Calls的次数。这可以提高性能和渲染效率。 GPU instancing可用于绘制在场景中多次出现的几何体,例如树木或…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
