【每日易题】数据结构链表篇——单链表oj题(1),几道典型例题带你快速掌握单链表

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,今天来填一个埋了好久的坑,在暑假之前就预告过这个系列,但由于各种原因(主要是有点懒)今天才开坑。我们这个系列主要是根据博主自身的编程学习的经历来带大家分模块来刷一些经典的题型,通过做题来加深大家对该部分内容的掌握。
好了,废话不多说,开始今天的学习吧!

  • 我们的刷题顺序是从入门到入土,其中前面入门的内容与后面入土的内容有些还有一定的联系,能直接帮助你入土哦!!!(好了,不开玩笑,只要你好好琢磨琢磨这些题你都能独立完成的)

一.移除链表元素

  • 本题oj链接如下:移除链表元素
    在这里插入图片描述
  • 其中关于题目的文字描述并不难理解,通过结合给的示例我们知道本题想要删除链表中所有等于val的值,返回把剩下节点连在一起的头节点。
  • 下面提供改题目的解答思路以及代码实现
  • 1.该题其实与我们之前讲的单链表的中间删除非常相似,只不过我们的中间删除是通过地址来找到需要删除的位置,而本题需要的找到节点中等于val的值删除,我们只需要让等于val的节点的前一个节点跳过值等于val的节点指向val下一个节点,最后再把等于val的节点free释放掉即可
struct ListNode* removeElements(struct ListNode* head, int val) {if(head == NULL)//链表中什么都没有return NULL;struct ListNode* cur = head;struct ListNode* prev = NULL;while(cur){//如果当前节点是需要删除的节点if(cur->val == val){//首先保存下一个节点struct ListNode* next = cur->next;//如果删除的为头节点,更新头节点//否则让当前节点的前趋节点链接next节点if(prev == NULL){head = cur->next;}else{prev->next = cur->next;  }//释放当前节点,让cur指向nextfree(cur);cur = next;}else{//如果cur不是需要删除的节点,则更新prev,curprev = cur;cur = cur->next;}}return head;//返回新头
}

在这里插入图片描述


二.反转链表

  • 本题oj链接如下:反转链表
    在这里插入图片描述

  • 该题有两种思路,我们分别来介绍一下,并代码实现

  • 1.链表中有一种插入方式叫头插,顾名思义就是在头部进行节点的插入,比如你在链表中依次头插 1 2 3 4 5,那么其实在链表中其实是反过来依次从头插的,也就是 5 4 3 2 1.这与我们这题想要我们实现的反转链表不就对上了吗?

struct ListNode* reverseList(struct ListNode* head){//把原链表中的节点依次头插入新链表中struct ListNode*newnode=NULL;struct ListNode*cur1=head;while(cur1){//头插 struct ListNode*next=cur1->next;cur1->next=newnode;newnode=cur1;cur1=next;}return newnode;}

在这里插入图片描述

  • 2.通过三个指针倒转该链表,我们假设此时有三个指针,其中n1指向head,n2指向n1的next,n3指向n2的next,此时逻辑图如图所示。
    在这里插入图片描述
  • 我们想要该链表反转,我们可以让链接两个节点的箭头转向,用c语言的话来说,就是让该节点的指针从指向下一个节点变为指向上一个节点,由于此时的1变为了新的尾,我们把1的next置空,如图`
    在这里插入图片描述
  • 当我们完成这一步后,下面我们需要把三个指针都往前走一步,让链表中未反转的节点也反转一下

在这里插入图片描述

  • 我们的结束条件是什么呢?当我们的n1是最后一个节点时,说明我们链表中所有的节点都已经反转完成,此时是不是就可以停了?此时由于n2为的前一位,也就是n2为空时,n1就来到了我们的最后一位,因此我们可以把n2为空作为循环停止的条件

在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head) {if(head == NULL || head->next == NULL)//说明此时只有一个节点或者没有节点,直接返回head即可return head;struct ListNode* n1, *n2, *n3;n1 = head;n2 = n1->next;n3 = n2->next;n1->next = NULL;//中间节点不为空,继续修改指向while(n2){//中间节点指向反转n2->next = n1;//更新三个连续的节点n1 = n2;n2 = n3;if(n3)//防止n3越界,判断一下n3是否为空n3 = n3->next;}//返回新的头return n1;
}

在这里插入图片描述

3.链表的中间结点

  • oj链接如下:链表的中间结点
    在这里插入图片描述
  • 这个oj题同样有两种解法,我们还是来一种一种的分析
  • 1.暴力求解法
  • 题目要求的是找到链表的中间结点,那么我们首先可以先遍历一遍链表同时计数,以此达到记录链表中有多少结点的目标,之后我们在取计数的一半,让链表遍历一半,此时的结点就是我们的中间结点啦!
struct ListNode* middleNode(struct ListNode* head){struct ListNode*cur=head;struct ListNode*midcur=head;int size=0;//标记计数while(cur){size++;cur=cur->next;}int len=size/2;//取链表节点数的一半找到中间结点while(len){midcur=midcur->next;len--;}return midcur;
}

在这里插入图片描述

  • 第二种方法就比较巧妙了,我们现在来通过一个实际的例子来帮助大家理解。
  • 某天,一个老和尚测试一个小和尚几个问题,并要求他在半炷香内回答出来,此时老和尚委托你来负责计时,但是由于寺庙里香不够了,只有一炷香供你计时,那么此时你应该怎么做呢?
  • 答案是:从两头同时开始烧
  • 这个实际的例子有没有带给你什么启发呢?我们同样是需要求链表的中间结点,也就是一半。
  • 揭晓答案:使用快慢指针,快的一次走两步,慢的一次走一步,当快的走到尾时,慢的指针此时就在中间结点。
  • 类比一下,此时快指针就是从两头烧,慢指针是从一头烧,当两头烧完时,就相当于一头烧烧完了半炷香!!
struct ListNode* middleNode(struct ListNode* head){struct ListNode*fast,*slow;fast=slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;}return slow;
}

在这里插入图片描述


总结

  • 今天的内容到这里就结束了,一次讲多了大家可能会贪多嚼不烂,所以暂时先介绍这三个典型的题,之后也会继续更新有关的其他题目。切记如果你想要真正学好的话一定要自己动手试试哦,光看不自己写是永远学不会的!!

  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

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

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

相关文章

1310. 数三角形

题目链接:https://www.acwing.com/problem/content/1312/ 首先不考虑三点共线的情况一共有 种,现在来计算三点共线的情况 1.三点在一条直线上 2.三点在一条竖线上 3.三点在一条斜线上,正反斜线对称,仅需考虑一边的情况 如果…

视频汇聚平台EasyCVR视频广场侧边栏支持拖拽

为了提升用户体验以及让平台的操作更加符合用户使用习惯,我们在EasyCVR v3.3版本中,支持面包屑侧边栏的广场视频、分组列表、收藏这三个模块拖拽排序,并且该操作在视频广场、视频调阅、电子地图、录像回放等页面均能支持。 TSINGSEE青犀视频…

服务器运行python程序的使用说明

服务器的使用与说明 文章目录 服务器的使用与说明1.登录2.Python的使用2.1 服务器已安装python32.2 往自己的用户目录安装python31.首先下载安装包2.解压缩3.编译与安装 2.3 新建环境变量2.4 测试 3 创建PBS作业并提交 1.登录 windowsr打开运行命令窗口,在运行框中…

【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

前言:在最近的实际开发的过程中,遇到了在多数据源的情况下要保证原子性的问题,这个问题当时遇到了也是思考了一段时间,后来通过搜集大量资料与学习,最后是采用了分布式事务来解决这个问题,在讲解之前&#…

puppeteer监听response并封装为express服务调用

const express require(express); const puppeteer require(puppeteer); const app express(); let browser; // 声明一个全局变量来存储浏览器实例app.get(/getInfo, async (req, res) > {try {const page_param req.query.page; // 获取名为"page"的查询参数…

接口测试之文件上传

在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。 首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格式…

Gson:解析JSON为复杂对象:TypeToken

需求 通过Gson&#xff0c;将JSON字符串&#xff0c;解析为复杂类型。 比如&#xff0c;解析成如下类型&#xff1a; Map<String, List<Bean>> 依赖&#xff08;Gson&#xff09; <dependency><groupId>com.google.code.gson</groupId><art…

MyBatis查询数据库之一(概念+创建项目+基础交互)

目录 1.MyBatis是什么&#xff1f; 2.为什么学习MyBatis&#xff1f; 3. 怎么学 MyBatis 4.第⼀个MyBatis查询 4.1 添加MyBatis框架支持 4.1.1老项目添加MyBatis 4.1.2 新项目添加MyBatis 4.2 配置连接字符串和MyBatis 4.2.1 配置连接字符串 4.2.2 配置 MyBatis 中的…

eNSP:ospf和mgre的配置

实验要求&#xff1a; 第一步&#xff1a;路由、IP的配置 r1&#xff1a; <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys r1 [r1]int loop0 [r1-LoopBack0]ip add 192.168.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

Golang之路---04 并发编程——信道/通道

信道/通道 如果说 goroutine 是 Go语言程序的并发体的话&#xff0c;那么 channel&#xff08;信道&#xff09; 就是 它们之间的通信机制。channel&#xff0c;是一个可以让一个 goroutine 与另一个 goroutine 传输信息的通道&#xff0c;我把他叫做信道&#xff0c;也有人将…

基于STM32CubeMX和keil采用通用定时器中断实现固定PWM可调PWM波输出分别实现LED闪烁与呼吸灯

文章目录 前言1. PWM波阐述2. 通用定时器2.1 为什么用TIM142.2 TIM14功能介绍2.3 一些配置参数解释2.4 PWM实现流程&中断2.4.1 非中断PWM输出(LED闪烁)2.4.2 中断PWM输出(LED呼吸灯) 3. STM32CubeMX配置3.1 GPIO配置3.2 时钟配置3.3 定时器相关参数配置3.4 Debug配置3.5 中…

C# Blazor 学习笔记(11):路由跳转和信息传值

文章目录 前言路由跳转测试用例路由传参/路由约束想法更新&#xff1a;2023年8月4日 前言 Blazor对路由跳转进行了封装。 ASP.NET Core Blazor 路由和导航 NavigationManager 类 本文的主要内容就是全局的跳转 路由跳转 路由跳转就要用到NavigationManager 类。 其实最常用…

【腾讯云Cloud Studio实战训练营】使用React快速构建点餐H5

文章目录 前言一、Cloud Studio是什么二、Cloud Studio特点三、Cloud Studio使用1.访问官网2.账号注册3.模板选择4.模板初始化5.H5开发安装 antd-mobile安装 Less安装 normalize&#xff1a;上传项目需要的素材&#xff1a;替换App.js主文件&#xff1a;项目启动、展示 6.发布仓…

K8s中的Secret

Secret作用&#xff1a;加密数据存在etcd里面&#xff0c;让pod容器以挂载Volume方式进行访问。场景&#xff1a;凭据

数据集相关网站(Open datasets and sources)

数据集相关网站(Open datasets and sources&#xff09; 数据集网站 Open datasets and sources政府数据网站 Government Data:金融数据网站 Financial Data Sources:犯罪数据网站 Crime Data:健康数据网站 Health Data:学术和商业数据网站 Academic and Business Data:其他数据…

用C语言构建一个数字识别卷积神经网络

卷积神经网络的具体原理和对应的python例子参见末尾的参考资料2.3. 这里仅叙述卷积神经网络的配置, 其余部分不做赘述&#xff0c;构建和训练神经网络的具体步骤请参见上一篇: 用C语言构建一个手写数字识别神经网路 卷积网络同样采用简单的三层结构&#xff0c;包括输入层con…

最新2024届【海康威视】内推码【GTK3B6】

最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网&#xff0c;选择岗位投递简历&#xff1b; 2.投递过程中填写内推码完成内推步骤&#xff0c;即可获得内推特权。 内推码&#xff1a;GTK3B6 内推码&#xff1a;GTK3B6 内推码&…

01背包笔记

01背包题目链接 题意&#xff1a;有一个容量为m的背包以及n个可以拿的物品&#xff0c;给出n个物品的体积和价值&#xff0c;要求输出可以拿的最大价值 思路&#xff1a;代表在前i件物品中拿取总体积不超过j的最大价值 由此可以分情况讨论状态转移 当j<v[i]时&#xff0c;说…

STM32(HAL)串口中断接收

目录 1、简介 2 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 1、简介 本文对HAL串口中断函数进行介绍。 2 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 串口外设配置 2.3 项目生成 3、KEIL端程序整合 首先在main.c文件中进行…