C语言中的数据结构--链表的应用1(2)
前言

上一节我们学习了链表的概念以及链表的实现,那么本节我们就来了解一下链表具体有什么用,可以解决哪些实质性的问题,我们借用习题来加强对链表的理解,那么废话不多说,我们正式进入今天的学习
单链表相关经典算法OJ题1:移除链表元素
https://leetcode.cn/problems/remove-linked-list-elements/description/
题目详情

题解
思路一:
要想解决这个题目,我们首先需要创建一个名为 pcur 的变量,用来遍历整个链表,找到与 val 相等的值,当我们找到了值为 val 的节点,我们不能直接释放掉这个节点,这样会导致后面的数据无法被找到,我们此时还需要定义一个变量 prev ,让 prev 一只指向 pcur 的前一个节点。当我们找到值为 val 的节点,该节点此时被 pcur 指向,我们需要用 pcur->next 来找到它的下一个节点,我们再次创建一个变量 next ,把 pcur->next 存入 next 变量中,并且把这个节点与 prev 所指向的节点连接起来,再释放掉 pcur ,此时就完成了移除链表元素的功能
思路二:
我们重新创建一个链表 newHead 和新链表的尾节点指针 newTail ,我们在原链表中进行遍历,将所有值不为 val 的节点尾插至新链表中去。
我们首先需要创建一个名为 pcur 的变量,用来遍历整个链表,若找到的值不为 val ,则直接尾插到新链表的 newTail 后面去,同时让 newTail 指针向后挪动,而 newHead 指针一直保持不变
假设我们用思路二来解决问题
我们想要完成该函数的功能,首先我们需要往函数中传入两个变量
1.链表的头节点 struct ListNode* head
2. value 的取值 int val
在开始插入的时候我们还需要判断链表当前的情况,到底是为空还是不为空
如果链表为空的话,要将 newHead 和 newTail 都赋予 pcur,此时头节点等于尾节点
如果链表不为空,newTail->next 要等于 pcur 而此时 newTail 变量要等于 newTail->next
排查
此时我们再来考虑一下特殊情况,若是要移除的数据是链表的尾节点。
我们遍历到原链表的倒数第二个数据的时候,倒数第二个数据的 next 指针指向了尾节点,即使不插入最后一个元素到新链表中,倒数第二个节点仍然可以通过它自身的 next 指针找到原链表的尾节点,此时就会导致代码出现错误,原链表中的尾节点还是被插入到了新链表中去了
那么我们怎么才能在这种情况下不带上最后一个节点呢?
当我们找到并且尾插了倒数第二个节点的时候,我们此时把它的 next 指针赋予空指针 NULL,这样他就找不到原链表的最后一个节点了
此时我们还要考虑到一个问题,因为题目中说了,列表的节点数目可以为0,若链表的节点个数为0时,此时我们就不能把 newTail 中的 next 指针设置为空指针,这样就会造成对空指针进行解引用的问题
那么根据上述的逻辑以及注意事项的规避,我们可以写出代码如下:
typedef struct ListNode ListNode;struct ListNode* removeElements(struct ListNode* head, int val)
{//创建一个新链表ListNode * newHead, * newTail;newHead = newTail = NULL;//遍历原链表ListNode* pcur = head;while (pcur){//找值不为 val 的节点,然后尾插到新链表中if (pcur->val != val){//链表为空if (newHead == NULL){newHead = newTail = pcur;}//链表不为空else{newTail->next = pcur;newTail = newTail->next;}}pcur = pcur->next;}if (newTail)newTail->next = NULL;return newHead;
}
我们在Leetcode官网检测一下结果是否正确:

代码成功的解决问题,该题目完成
单链表相关经典算法OJ题2:反转链表
题目详情

题解
思路一:
我们可以创建一个新的链表,我们逐一的遍历原链表,让里面的每一个节点按顺序头插到新链表之中去,当遍历结束后,此时我们拿到的新链表就是反转了以后的链表
思路二:
我们先创建三个变量:分别为 n1 n2 n3。我们先让 n1 指向空指针,让 n2 指向链表的头节点,让 n3 指向 n2 的下一个节点
要完成链表的反转,我们需要按以下步骤操作:

1.先让 n2 的 next 指针不再指向 n3 ,而是让它指向 n1 (n1 初始的情况下为空指针)

2.我们再让 n1 指向 n2 ,让 n3 指向它的下一个节点

3.我们重复以上步骤,让 n2 的 next 指针不再指向 n3 ,而是让它指向 n1

4.一直重复以上步骤,当 n2 和 n3 已经找不到节点了,此时我们可以跳出循环,现在 n1 指向的位置就是反转以后链表的头节点
5.因为原题目说了,链表可以为空,所以我们还需要判断是否为空
此时我们来尝试实现代码:
typedef struct ListNode ListNode;struct ListNode* reverseList(struct ListNode* head)
{//判空if (head == NULL){return head;}//创建三个指针ListNode* n1, * n2, * n3;n1 = NULL, n2 = head, n3 = n2->next;while (n2){n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}return n1;
}
提醒:最后一次让 n3 = n3->next 的代码不能够执行,因为此时 n3 已经是空指针了,不能对空指针进行解引用,所以我们需要对 n3 加以判断
我们现在在Leetcode的官网运行一下代码:

代码成功的解决问题,该题目完成
单链表相关经典算法OJ题3:链表的中间结点
题目

题解
思路一:
我们可以遍历全链表,定义一个变量 count 用来计算遍历的节点数,当遍历结束后直接返回 (count / 2)节点,则该节点就是链表的中间节点
思路二:(快慢指针)
我们首先分为奇数个和偶数个两种情况
我们先定义两个变量,一个叫做 slow 指针,一个叫做 fast 指针,我们让 slow 指针每次走一步,fast 指针一次走两步,2slow = fast
1.若链表的节点数为奇数个,当 fast->next 指针指向到 NULL 指针时,此时 slow 指针刚好指向链表的中间节点
2.若链表的节点数为偶数个,当 fast 指针指向到 NULL 指针时,此时 slow 指针刚好指向链表的中间节点
有了这个思想以后,我们试着写出代码:
typedef struct ListNode ListNode;struct ListNode* middleNode(struct ListNode* head)
{//创建快慢指针ListNode* slow = head;ListNode* slow = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;}//此时slow刚好指向中间节点return slow;}
我们在 Leetcode 的官网运行一下代码,看看结果

代码成功的解决问题,该题目完成
结尾
本节我们了解了链表在题目中的应用,下一节同样给大家细细讲解链表在题目中的应用,帮助大家更好的理解链表,那么本节的内容就到此为止了,谢谢您的浏览!!!

相关文章:
C语言中的数据结构--链表的应用1(2)
前言 上一节我们学习了链表的概念以及链表的实现,那么本节我们就来了解一下链表具体有什么用,可以解决哪些实质性的问题,我们借用习题来加强对链表的理解,那么废话不多说,我们正式进入今天的学习 单链表相关经典算法O…...
.Net6 使用Autofac进行依赖注入
一、背景 刚接触.net 6,记录一下在.net6上是怎么使用Autofac进行动态的依赖注入的 二、注入方式 1、新建一个webapi项目,框架选择net 6 2、引用Nuget包---Autofac.Extensions.Dependency 3、在Program.cs上添加如下代码 //依赖注入 builder.Host.Us…...
第十二届蓝桥杯省赛真题(C/C++大学B组)
目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…...
DC40V降压恒压芯片H4120 40V转5V 3A 40V降压12V 车充降压恒压控制器
同步整流恒压芯片在现代电子设备中发挥着重要作用,为各种设备提供了稳定、高效的电源管理解决方案。 同步整流恒压芯片是一种电源管理芯片,它能够在不同电压输入条件下保持输出电压恒定。这种芯片广泛应用于各种电子设备中,如通讯设备、液晶…...
2、Qt UI控件 -- qucsdk项目使用
前言:上一篇文章讲了qucsdk的环境部署,可以在QDesigner和Qt Creator中看到qucsdk控件,这一篇来讲下在项目中使用qucsdk库中的控件。 一、准备材料 要想使用第三方库,需要三个先决条件, 1、控件的头文件 2、动/静态链…...
MATLAB算法实战应用案例精讲-【人工智能】AIGC概念三部曲(三)
目录 前言 算法原理 大模型 什么是AIGC? AIGC和Chat GPT的关系 常见的AIGC应用...
外汇110:外汇交易不同货币类别及交易注意事项!
外汇市场是一个庞大而复杂的市场,其中有各种各样的货币品种。对于外汇投资者来说,了解外汇品种的特性和走势是比较重要的。1. 货币种类 外汇市场中的货币品种可以分为主要货币、次要货币和外围货币。 主要货币:主要指美元、欧元、英镑、日元、…...
gerrit 拉取失败
在浏览器gerrit的设置界面设置的邮箱地址和在命令行使用git config --gloable user.email设置的邮箱地址必须保持一致吗 在浏览器gerrit的设置界面设置的邮箱地址和在命令行使用git config --global user.email设置的邮箱地址并不一定需要保持一致。这两个邮箱地址是独立的&am…...
大数据行业英语单词巩固20240410
20240410 Communication - 沟通 Example: Effective communication is essential for project success. 有效的沟通对于项目的成功至关重要。 Collaboration - 协作 Example: Team collaboration is crucial in achieving our goals. 团队协作对于实现我们的目标至关重要。 …...
天软特色因子看板 (2024.4 第3期)
该因子看板跟踪天软特色因子A05005(近一月单笔流出金额占比(%),该因子为近一月单笔流出金额占比(% 均值因子,用以刻画下跌时的 单成交中可能存在的抄底现象 今日为该因子跟踪第3期,跟踪其在SH000852 (中证1000) 中的表现,要点如下…...
使用QT 开发不规则窗体
使用QT 开发不规则窗体 不规则窗体贴图法的不规则窗体创建UI模板创建一个父类创建业务窗体main函数直接调用user_dialog创建QSS文件 完整的QT工程 不规则窗体 QT中开发不规则窗体有两种方法:(1)第一种方法,使用QWidget::setMask函…...
如何构建企业经营所需的商业智能(BI)能力
构建企业经营所需的商业智能(BI)能力是一项涉及诸多关键环节与细致考量的系统工程,通过科学的数据处理、分析与应用,赋能企业实现精准决策,提升运营效率,优化业务流程,并在竞争激烈的市场环境中…...
【vue】watch监听取不到this指向的数?
今天同事问我,watch里this指向的数值,别的地方却可以打印出来。工具也能看到数值,但打印出来却是undifined,先看看代码: 懒得打字了直接上截图吧 ps: 在Vue组件中,如果你在watch选项中访问this…...
Ubuntu-22.04安装VMware虚拟机并安装Windows10
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VMware是什么?二、安装VMware1.注册VMware账号2.下载虚拟机3.编译vmmon&vmnet4.加载module5.安装bundle 三、安装Windows101.基础配置2.进阶…...
ELK企业日志分析系统介绍
前言 随着企业级应用系统日益复杂,随之产生的海量日志数据。传统的日志管理和分析手段,难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下,ELK日志分析系统应运而生。本文将从ELK 日志分析系统的原理、架构及其在实践中的应用做相…...
在C#中读取写入字节流与读取写入二进制数据, 有何差异?
在C#中,读取和写入字节流与读取和写入二进制数据有些许不同,尽管它们在某些情况下可能会重叠使用。以下是它们之间的主要区别: 读取和写入字节流: 读取和写入字节流通常指的是处理文件或流中的原始字节数据。在C#中,可…...
数据库相关知识总结
一、数据库三级模式 三个抽象层次: 1. 视图层:最高层次的抽象,描述整个数据库的某个部分的数据 2. 逻辑层:描述数据库中存储的数据以及这些数据存在的关联 3. 物理层:最低层次的抽象,描述数据在存储器中时如…...
【汇编语言实战】输出数组中特定元素
C语言描述: #include <stdio.h> int main() {int a[]{1,2,3,4,5,6};printf("%d",a[3]); }汇编语言: include irvine32.inc .data arr dword 1,2,3,4,5,6 num dword 1 ;输出第二个元素 .code main proc mov esi,offset arr mov edx,nu…...
WordPress LayerSlider插件SQL注入漏洞复现(CVE-2024-2879)
0x01 产品简介 WordPress插件LayerSlider是一款可视化网页内容编辑器、图形设计软件和数字视觉效果应用程序,全球活跃安装量超过 1,000,000 次。 0x02 漏洞概述 WordPress LayerSlider插件版本7.9.11 – 7.10.0中,由于对用户提供的参数转义不充分以及缺少wpdb::prepare(),…...
MOS管的判别符号记忆与导通条件
参考链接 MOS管的判别与导通条件 (qq.com)https://mp.weixin.qq.com/s?__bizMzU3MDU1Mzg2OQ&mid2247520228&idx1&sn5996780179fbf01f66b5db0c71622ac3&chksmfcef6c86cb98e590e3d3734ee27797bdded17b6b648b3b0d3b1599e8a4496a1fa4e457be6516&mpshare1&…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
