输入一个链表,输出该链表的倒数第 k 的结点

news2024/9/25 1:23:55

一、思路

假设 K 是 2,根据下面的图片可以看出,倒数第 K 个结点就是 45。

需要注意的前提是,K 不能是负数也不能是 0 并且也不能超过链表的结点个数,因为要保证 K 是在链表的范围里,才能找到 K,然后返回这个结点,如果这个结点就不可能找的到,就不可能返回它。

将所有的结点都遍历一遍后才有可能找到倒数第 K 个结点,因此肯定是要使用循环来一个结点一个结点遍历。
接着就是判断当前的结点是不是目标结点,如果是那就跳出循环,返回这个结点;如果不是,那就继续找下一个结点,直到将链表完整的遍历一边。

接下来要实现的就是循环的结束条件,也就是如何判断当前的结点是不是 目标结点。
可以先定义 fast 和 slow 两个指针,在最开始的时候都指向头结点的位置,但是要先让 fast 走K-1步。

具体会指向哪个结点要根据 K 来决定,如果此时 K 是负数或者是 0,再或者超过了链表的结点个数,
此时 fast 指向的位置肯定是不合法的。


当 K 为 0,fast 就会走到 0-1 的位置上,此时明显不合法。



当 K 为 -1时,fast 就会走到 -1-1 的位置上,此时依然明显不合法。



当 K 的值超过了链表结点个数的时候,fast 最终会走到超过链表的位置。

以上三种不合法的情况,显然是不能够为我所用的。

因此在代码最开始时,肯定是要先判定当前的 K 是不是合法的,如果合法再进入到下一步;
如果不合法,就直接返回一个 null,以此来表示当前 K 的给值是有问题的。

当 fast 走完 K-1 步后,再让两个结点一步一步的走,由于 fast 是先走的,因此肯定会比 slow 走得多。当 fast 的下一个结点为空时,此时 slow 指向的就正好是倒数第 K 个结点了。此时的循环就结束了,跳出以后直接返回 slow 即可。



当 K 的值为 1 时,fast 走 K-1 步也就是一步也不动,两个指针是在头结点的位置就开始一起移动的。
当 fast 的下一个结点为空时,可以看到 slow 指向的就恰好是倒数第 1(K的值) 个结点 。

这种思路不受奇数结点与偶数结点的影响,不管是链表结点是奇数还是偶数,这种方法都适用。


当 fast 走完 K-1步后会始终比 slow 多走一步,因此当 fast 的下一个结点为空时 slow 指向的恰好是 fast 的前一个结点,也就是倒数第 2 (K的值)个结点。


二、详细过程

1、首先要判断 K 的取值是不是合法的,如果不是合法的就直接返回一个 null。

//k位置不合法
if (k <= 0 || this.head == null) {
    return null;
}


2、定义两个指针,一个叫做 fast,一个叫做 slow,然后让它们都指向头结点。

//定义一个fast和slow指向head
ListNode fast = this.head;
ListNode slow = this.head;


3、先让 fast 走 K -1 步。

while (k - 1 != 0) {
    fast = fast.next;
    if (fast == null) {
        return null;
    }
    k--;
}

假设此时的 K 取值是 2,fast 会先走 1 步,如果当前的 K 的取值是 1 ,fast 一步也不会走。
上述的循环会直接进不去。


当 K 取值是 2 是,fast 会先走到第二个结点的位置。

4、让两个指针同时移动。

//然后两个一起走
//当fast.next==null的时候,slow所指的位置就是倒数第k个结点
while (fast.next != null) {
    //两个一起走
    fast = fast.next;
    slow = slow.next;
}
return slow;//此时slow指向的就是倒数第k个结点


倒数第2个结点就是此时 slow 指向的这个结点。

完整代码

public ListNode findKthToTail(int k) {
    //k位置不合法
    if (k <= 0 || this.head == null) {
        return null;
    }

    //定义一个fast和slow指向head
    ListNode fast = this.head;
    ListNode slow = this.head;

    //先让fast走k-1步
    while (k - 1 != 0) {
        fast = fast.next;
        if (fast == null) {
            return null;
        }
        k--;
    }

    //然后两个一起走
    //当fast.next==null的时候,slow所指的位置就是倒数第k个结点
    while (fast.next != null) {
        //两个一起走
        fast = fast.next;
        slow = slow.next;
    }
    return slow;//此时slow指向的就是倒数第k个结点
}



可以看到此时通过了牛客上的测试。
\

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

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

相关文章

【网络】TCP三次握手和四次挥手(感性理解)

目录 三次握手 文字描述三次握手过程 为什么是三次握手&#xff1f; 什么是SYN洪水&#xff1f; 连接和半连接队列 一次、两次握手行不行&#xff0c;四/五/六次握手行不行&#xff1f; 三次握手一定会成功吗&#xff1f; 三次握手的过程中可不可以携带数据 TCP中的IS…

模块化规范

常用模块化有两种规范&#xff0c;commonJS和ES6 一&#xff1a;两者区别 二&#xff1a;如何转义&#xff1f; 我们常遇到的使用场景是&#xff0c;在commonJS的模块里需要引入ES6规范的模块。这时就需要把ES6模块转译为commonJS规范的模块&#xff0c;否则报错 转义工具有…

javassist 02 implement interface

创建 interface package com.wsd;public interface AccountDao {int delete(); }利用 javassist 生产一个 类A, Class A implements AccountDao package com.wsd;import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifi…

mac桌面时钟 浮动 (python)

浮动时钟&#xff0c;多地时区 app store的都要钱&#xff0c;于是。。。。我们让chatgpt来实现一个吧&#xff1a; 数字&#xff1a; 代码&#xff1a; import sys import datetime import pytzfrom PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsView, QGr…

深度学习不同数据增广方法的选用分析

一般情况下&#xff0c;可以将数据扩增方法分为单数据变形、多数据混合、学习数据分布规律生成新数据和学习增广策略等4 类方法。以上顺序也在一定程度上反映了数据增广方法的发展历程。如果与Shorten和Khoshgoftaar的成果对照&#xff0c;就图像数据而言&#xff0c;基于数据变…

抖音矩阵源码搭建开发技术部署分析

目录 一、 什么是抖音矩阵&#xff1f;源码搭建开发注意事项&#xff1f; 1. 抖音矩阵概述 2. 源码搭建开发注意事项&#xff1a; 二、 使用步骤及开发代码展示 一、 什么是抖音矩阵&#xff1f;源码搭建开发注意事项&#xff1f; 1. 抖音矩阵概述 首先&#xff0c;抖音账…

21夜间车牌识别(matlab程序)

1.简述 简单说一下实现思路&#xff1a; 读取图片&#xff0c;转灰度&#xff0c;计算灰度直方图&#xff0c;估算阈值&#xff08;这里的阈值计算很重要&#xff0c;经过阈值算法&#xff0c;选取一个最恰当的阈值&#xff09;&#xff0c;之后二值化。显示图像即可。 实现目…

爬虫爬取公众号文章

前言 自从chatGPT出现后&#xff0c;对于文本处理的能力直接上升了一个维度。在这之前&#xff0c;我们爬取到网络上的文本内容之后&#xff0c;都需要写一个文本清理的程序&#xff0c;对文本进行清洗&#xff0c;而现在&#xff0c;有了chatGPT的加持&#xff0c;我们只需要…

解决程序占用较多内存的问题

今天发现自己开发的一个程序占用了大量内存而且不会自动释放 &#xff0c;我的程序在windows中运行的&#xff0c;解决办法如下&#xff1a; 第一步&#xff1a;打开任务管理器&#xff0c;打到正在运行程序 &#xff08;这里以sql server为例&#xff09;&#xff0c;然后右击…

设计合并排序算法实现对N个整数排序。

1.题目 设计合并排序算法实现对N个整数排序 2.设计思路 先将无序序列利用分治法划分为子序列,直至每个子序列只有一个元素,然后再对有序子序列逐步进行合并排序。合并方法是循环的将两个有序子序列当前的首元素进行比较,较小的元素取出,置入合并序列的左边空置位,直至其中…

特征选择算法 | Matlab 基于最大相关最小冗余特征选择算法(mRMR)的分类数据特征选择

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab 基于最大相关最小冗余特征选择算法(mRMR)的分类数据特征选择 部分源码 %--------------------

Redis实战案例12-添加秒杀券实现秒杀下单及相关问题解决

1. 添加优惠券 该项目没有后台管理的界面&#xff0c;所以采用postman发送请求 http://localhost:8081/voucher/seckill注意end时间要大于当前系统时间 {"shopId": 2,"title": "100元代金券","subTitle": "周一至周五均可使用&qu…

c++查漏补缺

c语言的struct只能包含变量&#xff0c;而c中的class除了包含变量&#xff0c;还可以包含函数。 通过结构体定义出来的变量还是变量&#xff0c;而通过类定义出来有了新的名称&#xff0c;叫做对象。C语言中&#xff0c;会将重复使用或具有某项功能的代码封装成一个函数&#x…

【剑指offer】8. 斐波那契数列(java)

文章目录 斐波那契数列描述输入描述&#xff1a;返回值描述&#xff1a;示例1示例2示例3思路非递归递归 完整代码 斐波那契数列 描述 大家都知道斐波那契数列&#xff0c;现在要求输入一个正整数 n &#xff0c;请你输出斐波那契数列的第 n 项。 斐波那契数列是一个满足 f …

PHP学生工作平台管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP学生工作平台管理系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为PHP APACHE&#xff0c;数据 库为mysql5.0&#xff0c;使用php语言开发…

linux 如何挂载fat32格式u盘,如何挂载NTFS 文件系统的硬盘

linux系统默认可以识别fat32u盘&#xff0c;对ntfs格式u盘不能识别 具体挂载方式如下 1、插入u盘 2、mkdir /mnt/usb 此命令用于创建挂载u盘的目录&#xff0c;只需创建一次就可以&#xff0c;若已经存在则不需要再次创建 3、fdisk -l 找到u盘路径 上图显示的sdb1,sdb2,sdb5…

Gradio,我们可以为我们的模型创建Web界面

Gradio是一个Python库&#xff0c;允许我们快速为机器学习模型创建可定制的接口。 使用Gradio&#xff0c;我们可以为我们的模型创建Web界面&#xff0c;而无需编写任何HTML&#xff0c;CSS或JavaScript。 Gradio旨在与广泛的机器学习框架配合使用&#xff0c;包括TensorFlow&a…

IOU发展历程学习记录

概述 IOU的出现主要最先运用在预测bbox框和target bbox框之间的重叠问题&#xff0c;为NMS提供相应的数值支撑。另外在bbox框的回归问题上&#xff0c;由于L1 Loss存在如下问题&#xff1a;当损失函数对x的导数为常数&#xff0c;在训练后期&#xff0c;x很小时&#xff0c;若…

GEE:基于MODIS土地覆盖类型“混交林”的净初级生产力(NPP)的区域统计

作者:CSDN @ _养乐多_ 本文将介绍如何使用Google Earth Engine(GEE)平台提取特定地区的净初级生产力(NPP)的统计信息,并在地图上可视化。通过加载MODIS数据集,并使用GEE提供的函数和方法,能够高效地计算特定地区的净初级生产力的平均值。 文章目录 一、代码详解二、代…

大模型的数据供血系统-向量数据库常识科普

1. 数据库行业有了新动向 对于传统数据库研发运维来说&#xff0c;数据库行业上次有概念创新&#xff0c;还是十几年前的NoSQL…… 在AI大行业发展的推进下&#xff0c;向量数据库成为了最新兴的数据库技术趋势&#xff0c;业内多家开源向量数据库都拿到了高额融资&#xff0c;…