算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)

news2024/9/24 3:29:12

img

😀前言
在编程过程中,链表是一种常见的数据结构,它能够高效地进行插入和删除操作。然而,遍历链表并找到特定节点是一个典型的挑战,尤其是当我们需要找到链表中倒数第 K 个节点时。本文将详细介绍如何使用双指针技术来解决这个问题,并提供一个基于 Java 的具体实现。

🏠个人主页:尘觉主页

文章目录

  • 🥰链表中倒数第 K 个结点
    • 😄描述
    • 😉示例1
    • 😉示例2
    • 😀解题思路
    • 🥰代码实现
      • 😊 性能分析
    • 😄总结

🥰链表中倒数第 K 个结点

牛客网

😄描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为 0 的链表。

数据范围:0≤n≤105,0≤ai≤109,0≤k≤109

要求:空间复杂度 O(n),时间复杂度 O(n)

进阶:空间复杂度 O(1),时间复杂度 O(n)

例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:

img

其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。

😉示例1

输入:{1,2,3,4,5},2
返回值:{4,5}
说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。

😉示例2

输入:{2},8
返回值:{}

😀解题思路

解决这个问题的关键在于如何有效地遍历链表,同时保证我们能准确定位倒数第 K 个节点。最常见的方法是使用双指针技巧,即使用两个指针 P1P2 来遍历链表。

  1. 初始化双指针: 首先,让指针 P1 向前移动 K 个节点,期间如果 P1 已经到达链表末尾,则表示链表长度不足 K,返回空链表。
  2. 同步移动双指针:P1 移动到链表末尾时,指针 P2 开始从链表头同步移动。由于 P1 已经提前移动了 K 个节点,当 P1 到达链表末尾时,P2 正好位于倒数第 K 个节点处。
  3. 返回结果: 最终,返回指针 P2 所指向的节点,该节点即为所需的倒数第 K 个节点。

6b504f1f-bf76-4aab-a146-a9c7a58c2029

🥰代码实现

下面是基于上述思路的 Java 代码实现:

public class Solution {
    public ListNode FindKthToTail(ListNode head, int k) {
        // 如果链表为空,直接返回 null
        if (head == null)
            return null;

        // 定义两个指针
        ListNode P1 = head;

        // 让 P1 先向前移动 K 个节点
        while (P1 != null && k-- > 0)
            P1 = P1.next;

        // 如果 K 还大于 0,说明链表长度小于 K
        if (k > 0)
            return null;

        // 定义第二个指针 P2
        ListNode P2 = head;

        // 同步移动 P1 和 P2,直到 P1 到达链表末尾
        while (P1 != null) {
            P1 = P1.next;
            P2 = P2.next;
        }

        // 返回 P2,此时 P2 位于倒数第 K 个节点
        return P2;
    }
}

😊 性能分析

该算法的时间复杂度为 O(n),因为我们需要遍历链表两次:一次用于将 P1 指针移动 K 个节点,另一次用于同步移动 P1P2。空间复杂度为 O(1),因为我们只使用了固定数量的额外空间,即两个指针。

😄总结

通过使用双指针技术,我们能够高效地找到链表中的倒数第 K 个节点。这种方法不仅简单明了,而且在大多数情况下都能提供良好的性能表现。在处理链表相关问题时,双指针技术是一个非常有用的工具。希望本文的讲解能帮助你更好地理解和解决类似的链表问题。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

48天笔试训练错题——day47

目录 选择题 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 编程题 1. 合唱团 2. 马戏团 选择题 1. 子网掩码是 255.255.255.0,前三个字节都是 1,则表示有 24 位网络号和子网号。又是 B 类 IP 地址,只有 16 位网络号,所有第三个…

聊聊JS中的WebSocket

你好,我是沐爸,欢迎点赞、收藏和关注。个人知乎 在JavaScript中,使用WebSocket非常简单直观。通过几行代码,你就可以轻松创建一个WebSocket连接,并监听来自服务器的消息。无论是开发实时聊天应用、在线游戏、实时数据分…

高效录制新选择:2024年Windows录屏软件

录屏能帮助我们捕捉屏幕上的精彩瞬间,作为老师可以用来录制课程,作为会议记录员可以用来录制远程会议。那么有什么软件是适合windows录屏的呢?这次我们一起来探讨一下吧。 1.福昕录屏大师 链接:www.foxitsoftware.cn/REC/ 这款软…

【数据结构】 顺序表的应用 - 通讯录的实现

0. 前言 上一期博客中,我们已经学习了顺序表是什么,以及顺序表相关接口的实现,了解了如何实现顺序表的插入和删除等功能,那么在这期博客,我们可以基于顺序表来实现一个通讯录,在通讯录当中能实现联系人的增…

【代码随想录训练营第42期 Day27打卡 贪心Part1 - LeetCode 455.分发饼干 376. 摆动序列 53. 最大子序和

目录 一、贪心 二、题目与题解 题目一:455.分发饼干 题目链接 题解:排序双指针贪心 题目二:376. 摆动序列 题目链接 题解:贪心 题目三:53. 最大子序和 题目链接 题解1:暴力(失败&…

解决生产环境服务启动失败:一次远程Bug排查与修复历程

一、问题现象 同事没事一直给服务器断电(直接拔插头那种!!!!) 二、初步排查 首先,我登录到生产服务器,查看服务启动日志。在日志中,我发现了一些异常信息,…

全网独家梳理:数字病理图像的常用存储格式以及格式转换的方法|24-08-17

小罗碎碎念 这一期推文,跟你们分享一些比较底层,并且顶刊中不会涉及但是又至关重要的内容。 我们在做任何一个病理AI的项目前,有两样东西是一定会拿到手的——切片&对应的临床基线表。(如果做多组学/多模态的项目,…

宠物空气净化器推荐购买吗?真的能除毛去味吗?

自从做了猫咖店老板,我这生活真的是美滋滋,每天都可以摸到不同品种的可爱的小猫咪,在赚钱养家的同时还能肆意和猫咪贴贴,连朋友都说想和我干一样的工作了。每天接待的顾客也不少,店里面的空气质量也还不错,…

模块一(任务2):SDH系统原理解读

一、PDH与SDH标准速率介绍 OTN网络技术是基于SDH系统和WDM系统设计的,所以学习OTN系统原理必须要掌握SDH和WDM量大系统原理 1、PDH与SDH概念及特点 二、SDH的帧结构 目前通信常见的数据结构有两种: 报文:基于以太网通信的数据结构 帧&am…

真诚巨作:全文一万字教你快速熟悉项目|文心快码帮你快速熟悉~

写在前面 : 上了好多年的学,终于毕业进入职场啦~在公司也有一段时间了,慢慢地也变成了纯正的社畜了。近来开始熟悉部门的项目代码,说实话公司的代码真跟以前接触的不一样,内部各种自建框架,让人看得眼花缭乱…

ARCGIS PRO 要素标注背景色透明度的设置

使用ArcGIS Pro 设置标注背景色的透明度 一、点击标注属性 二、点击符号、注释 三、下拉框选择背景 四、背景符号 五、点击颜色 六、编辑颜色 七、应用

Java语言程序设计基础篇_编程练习题**16.26(模拟:升旗并播放国歌)

目录 题目:**16.26(模拟:升旗并播放国歌) 习题思路: 代码示例 结果展示 音频来源 题目:**16.26(模拟:升旗并播放国歌) 创建一个显示升国旗的程序,如图15-14…

还在使用百度翻译?这4款翻译工具也能帮你打破语言壁垒!

是谁像我一样,一提到翻译工具第一想到的就是百度翻译。它可以是用了好久的翻译工具,可是随着学习的深入, 我还是发觉了一些其他的实用翻译工具。比如下面这四款: 1、365翻译工具 直达链接:https://fanyi.pdf365.cn/ …

NLP之transformer:transformer-explainer的简介、安装和使用方法、案例应用之详细攻略

NLP之transformer:transformer-explainer的简介、安装和使用方法、案例应用之详细攻略 目录 相关论文 《Transformer Explainer: Interactive Learning of Text-Generative Models》翻译与解读 transformer-explainer的简介 transformer-explainer的安装和使用方…

尚硅谷MYSQL(12-13章)

第十二章数据类型 比如说tinyint(4)这个四表示的是那个取值范围的位数 他只是一个显示 比如说int后面应该是int(11)这是有符号的 无符号int是int(10) 如果写成int(3)但是存的数据是…

论文写作新神器!10款可以写论文的人工智能软件

在当今快速发展的数字时代,人工智能(AI)技术已经渗透到各个领域,包括学术研究和论文写作。为了帮助学者和学生提高写作效率和质量,市场上涌现了许多优秀的AI写作工具。本文将详细介绍10款可以写论文的人工智能软件&…

STM32F103C8T6单片机原理图设计(PCB板)

先了解了以下stm32f103c8t6的引脚使用: 对比过一些原理图,我发现除了特定协议的引脚功能,只要功能正确,可以自己选择连接对应的引脚。可以根据使用的LED/BEEP/DHT11/BH1750/ESP8266等模块的功能对应相应的引脚: WIFI(…

[开源] 安卓系统发送modbus协议到硬件设备下位机

最近是在研究安卓板子上的modbus通信,于是写了这个maven依赖。 项目中主要用到的功能是读写寄存器,所以依赖中重点测试了读写多个寄存器的协议。 另外你可以自定义协议pdu交给程序进行封装及发送。 如果使用中发现了什么问题,可以到仓库添…

DHU OJ 循环结构 整除的尾数

思路及代码 //input T int >0 //input a,b int 0< <10000 10< <100 #include<iostream> #include<iomanip> using namespace std; int main(){int T;cin >> T;while (--T > 0){int a, b;cin >> a >> b; //solution // (a*100…

Tomcat初篇

目录 Tomcat主要特点Tomcat的核心组件Tomcat使用安装Tomcat配置Tomcat启动和停止Tomcat Tomcat工作原理目录结构配置文件性能优化策略 Tomcat Apache Tomcat是一个开源的Servlet容器和Web服务器&#xff0c;广泛用于运行基于Java的Web应用程序。它实现了Java Servlet和JavaSer…