【leetcode】链表的中间节点|链表中倒数第k个节点

news/2024/5/13 21:08:27/文章来源:https://blog.csdn.net/m0_64538862/article/details/131938230

目录

1.链表的中间节点

2.链表中倒数第k个节点 


1.链表的中间节点

思路1:遍历链表,统计节点个数count,返回第count/2 +1个节点 

📖Note:注意循环条件为--mid,--mid循环执行mid-1次,mid--循环mid次,返回的是中间节点的下一个节点

struct ListNode* middleNode(struct ListNode* head){struct ListNode* cur = head;int count = 0;//统计节点个数while(cur){count++;cur = cur->next;}//返回第count/2+1个节点cur = head;int mid = count/2 + 1;while(--mid){cur = cur->next;}return cur;}

思路二:快慢指针

设置一个慢指针slow,一个快指针fast,慢指针一次走一步,快指针一次走两步

需要分两种情况:链表节点个数为奇数个和节点个数为偶数个

1️⃣奇数个的情况

当链表节点个数为奇数个时,可以发现,快指针fast->next == NULL时,遍历结束,此时慢指针slow刚好指向中间节点

2️⃣偶数个的情况:

当链表节点个数为偶数个时,可以发现,快指针fast == NULL时,遍历结束,此时慢指针slow刚好指向中间节点

 综上:遍历结束的条件为fast == NULL或fast->next == NULL

参考代码如下:

struct ListNode* middleNode(struct ListNode* head){struct ListNode* fast = head;struct ListNode* slow = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}

2.链表中倒数第k个节点 

与上题思路二相似的还有下例 

分析:

输出链表中倒数第k个节点,假设有一个指针指向链表尾节点的next,即指向NULL,我们从这个节点向前看,尾节点相对这个指针来说是第一个节点,相对链表头指针head来说便是倒数第一个节点,对于倒数第k个节点,指向这个节点的指针和指向NULL的指针始终相差的是k个节点;设置一个快指针fast,一个慢指针slow,fast指针先走k步,slow指针不动,此时fast指针和slow指针就相差k个节点,然后slow指针和fast指针同时向后走,直到fast指针指向NULL,此时slow指向的节点就是倒数第k个节点

以输出倒数第三个节点为例,步骤如下图:

🌸特殊情况讨论:

1️⃣空链表:返回空指针

2️⃣倒数第一个

由上图可以发现,输出倒数第一个节点的逻辑与输出倒数的k个节点的逻辑相同 

3️⃣倒数第N个(链表长度为N)

由上图可以发现,输出倒数第N个节点的逻辑与输出倒数的k个节点的逻辑相同 

4️⃣k=0或k>N(N为链表的长度)

  • k=0时,输出链表的倒数第0个节点,应该为空

此时fast指针和slow指针都不会发生变化,,所以

  • k>N时,fast先走k步会发生空指针的访问

在fast指针向后走k步的过程中,需要随时检查fast指针的有效性,如果fast==NULL,直接返回空指针即可

参考代码如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {// write code herestruct ListNode* slow = pListHead,*fast = pListHead;if(pListHead){while(k--){if(fast == NULL){return fast;}fast = fast->next;}while(fast){slow = slow->next;fast = fast->next;}}return slow;}

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

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

相关文章

ubuntu开机自启动

ubuntu开机自启动 1、建一个test.sh脚本,并写入 #!/bin/sh gnome-terminal -x bash -c ‘cd /home/文件路径/;python3 main.py’ exit 0 2、:wq!保存 3、创建rc-local.service文件(sudo vim /etc/systemd/system/rc-local.service)&#xf…

VAE-根据李宏毅视频总结的最通俗理解

1.VAE的直观理解 先简单了解一下自编码器,也就是常说的Auto-Encoder。Auto-Encoder包括一个编码器(Encoder)和一个解码器(Decoder)。其结构如下: 自编码器是一种先把输入数据压缩为某种编码, 后仅通过该编…

【Jenkins系列】-Pipeline语法全集

Jenkins为您提供了两种开发Pipeline的方式:脚本式和声明式。 脚本式流水线(也称为“传统”流水线)基于Groovy作为其特定于域的语言。而声明式流水线提供了简化且更友好的语法,并带有用于定义它们的特定语句,而无需学习…

记一次安装nvm切换node.js版本实例详解

最后效果如下: 背景:由于我以前安装过node.js,后续想安装nvm将node.js管理起来。 问题:nvm-use命令行运行成功,但是nvm-list显示并没有成功。 原因:因为安装过node.js,所以原先的node.js不收n…

STM32 USB使用记录:HID类设备(后篇)

文章目录 目的基础说明项目构建与代码调整接收发送代码与测试示例链接报告描述符总结 目的 接上篇: 《STM32 USB使用记录:HID类设备(前篇)》 USB HID 类的设备有个比较大的好处是大部分时候接入主机中都是可以免驱使用的。这篇文…

spring 存储对象 + 获取对象

前言 本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中,了解如何使用注释来获取容器中的Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1.通过注释将类加入IoC…

【LeetCode每日一题】——946.验证栈序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 中等 三【题目编号】 946.验证栈序列 四【题目描述】 给定 pushed 和 p…

Kyuubi入门简介

一、官方简介 HOME — Apache Kyuubi 二、概述 1、一个企业级数据湖探索平台 2、一个高性能的通用JDBC和SQL执行引擎 3、一个基于spark的查询引擎服务 三、优点 1、提供hiveserver2查询spark sql的能力,查询效率更为高效,首次构建连接时会持续保持连…

FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结

FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结 前面和大家分享了关于SRVO-050碰撞检测报警和SRVO-053干扰值过大的原因分析以及处理方法,感兴趣的朋友可以参考以下链接中的内容: FANUC机器人SRVO-050碰撞检测报警原因分析及处理对策

【ArcGIS Pro二次开发】(54):三调名称转用地用海名称

三调地类和用地用海地类之间有点相似但并不一致。 在做规划时,拿到的三调,都需要将三调地类转换为用地用海地类,然后才能做后续的工作。 一般情况下,三调转用地用海存在【一对一,多对一和一对多】3种情况。 前2种情况…

ROS从入门到精通6-8:costmap代价地图插件编写案例(prohibition_layer)

目录 0 专栏介绍1 为什么需要代价地图插件?2 自定义代价地图插件3 仿真测试 0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。 🚀详情&…

2023年的深度学习入门指南(20) - LLaMA 2模型解析

2023年的深度学习入门指南(20) - LLaMA 2模型解析 上一节我们把LLaMA 2的生成过程以及封装的过程的代码简单介绍了下。还差LLaMA 2的模型部分没有介绍。这一节我们就来介绍下LLaMA 2的模型部分。 这一部分需要一些深度神经网络的基础知识,不懂的话不用着急&#xf…

向npm注册中心发布包(下)

目录 1、在package.json文件中指定dependencies和devDependencies 1.1 将依赖项添加到 package.json 文件 1.2 从命令行中 将依赖项添加到 package.json 文件 1.3 手动编辑 package.json 文件 2、关于语义版本控制 2.1 在已发布的包中增加语义版本 2.2 使用语义版本控制…

Vue实现柱状图横向自动滚动

Vue实现柱状图横向自动滚动 1. 前言2. 代码3、实现效果图 1. 前言 原理:通过定时器修改Echarts的配置(options)达到我们想要的效果。 此外,我们还需要了解Echarts中dataZoom这个组件,这个组件用于:用于区域…

探究Spring Bean的六种作用域:了解适用场景和使用方式

这里写目录标题 单例(Singleton)作用域:原型(Prototype)作用域:请求(Request)作用域:会话(Session)作用域:全局(applicati…

MySQL绿色安装和配置

1、 从地址http://dev.mysql.com/downloads/mysql/中选择windows的版本下载。 2、 mysql各个版本的简介 (1) MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。 (2) MySQL Enterprise Ed…

文件上传--题目

之前有在技能树中学过文件上传,正好借这次进行一个整合: 技能树中所包含的题目类型有 无限制绕过 1.上传一句话木马 2.链接中国蚁剑 前端验证 1.会发现这个网站不让提交php,改后缀为jpg格式,再用burp抓包 2.在用中国蚁剑连接 .…

[start] m40 test

software & update 470 drive version # cd /etc/apt # mv sources.list sources.list.bak # sudo vi /etc/apt/sources.list # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ja…

Linux搭建Promtail + Loki + Grafana 轻量日志监控系统

一、简介 日志监控告警系统,较为主流的是ELK(Elasticsearch 、 Logstash和Kibana核心套件构成),虽然优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,操作苦…

【代码随想录day20】验证二叉搜索树

题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 思路 最开始想简单…