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&…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
在ubuntu等linux系统上申请https证书
使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具,支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上: sudo apt update sudo apt install certbot申请证书 纯手动方式(不自动配置)&…...

AI书签管理工具开发全记录(十八):书签导入导出
文章目录 AI书签管理工具开发全记录(十八):书签导入导出1.前言 📝2.书签结构分析 📖3.书签示例 📑4.书签文件结构定义描述 🔣4.1. 整体文档结构4.2. 核心元素类型4.3. 层级关系4.…...