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 的官网运行一下代码,看看结果

代码成功的解决问题,该题目完成

结尾

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

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

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

相关文章

题目:画图,综合例子。

题目:画图,综合例子。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should…

【CSS】利用Vue实现数字翻滚动画效果

利用Vue实现数字翻滚动画效果 在很多数据可视化的需求中,动态呈现数据变化是一个常见且具有较强视觉冲击力的手段,尤其是数字的实时变化。今天我们将探讨如何使用 Vue.js 和 CSS3 来实现数字的翻滚动画效果,即模拟真实物体在Z轴上翻动的效果…

二分查找总结(十八天)

704. 二分查找 题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输…

elasticsearch不删除索引只清理数据——筑梦之路

这里主要使用了elasticsearch的接口 _delete_by_query # 清理指定时间之前的数据curl -X POST "http://localhost:9200/[索引名]/_delete_by_query?pretty&wait_for_completionfalse" -H Content-Type: application/json -d {"query": {"range…

WPS 365开启企业一站式AI办公;联发科推出生成式AI服务平台;马斯克:AI 明年或超越人类智力

WPS 365 升级一站式 AI 办公 昨日,金山办公生产力大会举行,现场发布了面向组织和企业的办公新质生产力平台 WPS 365,其包含升级的 WPS Office、最新发布的 WPS AI 企业版和 WPS 协作。 WPS 365 将能覆盖一个组织日常办公基本需求&#xff0c…

我们把 Prompt 函数和类更进一步了

前言 上次我们发了一篇文章,很好的解决了 Prompt 的使用问题: 最好的Prompt管理和使用依然是 Class 和 Function - 继续让LLM和编程语言融合 相比其他方案,具有非常大的优势,完全融入到了现有的编程语言里,而不是大段的…

SpringBoot-如何设计优秀的后端接口?

在实际工作中,我们需要经常跟第三方平台打交道,可能会对接第三方平台API接口,或者提供API接口给第三方平台调用。 那么问题来了,如果设计一个优雅的API接口,能够满足:安全性、可重复调用、稳定性、好定位问…

Java快速入门系列-6(数据库编程与JDBC)

第六章:数据库编程与JDBC 6.1 SQL基础6.1.1 SQL基本结构与命令6.1.2 SQL高级查询6.1.3 SQL子查询与联接6.2 JDBC原理与使用6.2.1 JDBC驱动程序与URL6.2.2 Statement、PreparedStatement与CallableStatement6.2.3 数据库事务处理6.3 数据库连接池6.4 事务管理6.1 SQL基础 SQL(…

2. Spring的创建和Bean的存取

经过前面的学习我们已经大体明白了 IOC 思想以及它的实现方式 DI ,本节要讲的是如何Spring框架实现实现DI。 本节目标: Spring(Core) 项目创建将对象存储到 Spring 中将对象(bean)从 Spring 中取出 1. 创建 Spring 项目 与开篇演示的 Spring Boot 项目不…

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC(多版本并发控制)机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务,在写入新数据时不会直接替换旧数据,而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时,会导致读…

在Linux终端查找指定类型的文件并统计数量

下面举例说明: find /path/to/directory -type f -exec file {} \; | grep "MIDI"它的作用是在指定的目录(/path/to/directory)中搜索所有的文件(-type f),然后使用file命令检查每个文件的类型&a…

【C++学习】C++11新特性(第二节)—— 右值引用与移动语义超详解

文章目录 文章简介二.右值引用1.什么是左值,什么是右值?什么是左值引用,什么是右值引用?2.左值引用与右值引用比较 三.右值引用使用场景和意义1.左值引用的使用场景:2.左值引用的短板:3.右值引用与移动构造…

Axure RP中的相关概念及高保真原型构建方法

1 Axure RP中概念介绍 对于构建高保真原型来说,需要知道事件(Event)、Case、Action等概念。Axure RP中给出这些概念,是为了方便原型的构建,尤其是高保真原型的构建。 事件(Event)是附着于控件…

2024年万字长文-数据仓库面试题及参考答案全解析

数据仓库作为大数据分析的基石,对于大数据架构师而言,掌握其核心概念和技能至关重要。本文将深入探讨数据仓库相关的面试题,并提供详尽的参考答案,旨在帮助读者全面理解数据仓库的构建、管理和优化,以及如何在实际工作中应用相关知识。 目录 1. 数据仓库的定义及其与数据…

独孤思维:副业没做起来,要退钱

01 有些人,纯粹得可爱。 问我,项目没做起来,是不是该退钱? 那我反过来问你,你赚了钱,是不是该分我点? 02 昨天周一,是独孤最忙的时候。 因为各种大会小会,开了4个会…

PHP自助建站系统,小白也能自己搭建网站

无需懂代码,用 自助建站 做企业官网就像做PPT一样简单,您可以亲自操刀做想要的效果! 自助建站是一款简单、快捷、高效的工具,可以帮助您制作响应式网站。我们的自助建站系统,将传统的编码工作转化为直观的拖拽操作和文…

buuctf之jarvisoj_level2

一、查看属性 首先还是必要的查看属性环节: 可以知道该文件是一个x86架构下的32位小段ELF程序,开启了栈不可执行(NX)保护,ret2shellcode是不行的 简单执行可以看到有一个简单的输入后输出hello world 二、静态分析 …

程序员学CFA——数量分析方法(二)

数量分析方法(二) 数理统计基础统计学的基本概念描述性统计学与推断性统计学总体与样本四种度量尺度名义尺度排序尺度区间尺度比率尺度 数据的展现频率分布直方图与频数多边形 中心趋势均值算术平均几何平均调和平均数加权平均 中位数众数 离散程度绝对离…

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用:控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式:分别为push和replace,push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

【40分钟速成智能风控8】智能反欺诈模型2

目录 ​编辑 智能反欺诈模型 图计算 智能信用风险模型 专家模型 逻辑回归 决策树 集成树 深度神经网络 循环神经网络 智能反欺诈模型 图计算 图计算(Graph Computing)是以关联图谱为基础引申出来的一类算法的统称,主要解决了图数…