链表中倒数第k个节点,剑指offer,力扣

目录

题目地址:

剑指offer原题:

我们直接看题解吧:

解题方法:

难度分析:

审题目+事例+提示:

解题思路(双指针(快慢指针)):

代码实现:

代码优化:

代码实现(方法1):


题目地址:

LCR 140. 训练计划 II - 力扣(LeetCode)
难度:简单

今天刷链表中倒数第k个节点,大家有兴趣可以点上看看题目要求,试着做一下。

剑指offer原题:

输入一个链表,输出该链表中倒数第k个节点。

为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

我们直接看题解吧:

解题方法:

方法1、顺序查找(需两次遍历,先求出链表长度)

方法2、双指针(只需一次遍历,不需要求出链表长度)

两个方法的时间复杂度与时间复杂度均为(n),(1)

难度分析:

属于基础性题目,链表基础,以及双指针使用。

审题目+事例+提示:

注意,单链表的长度不包括头结点,头节点看作位序0,头结点指向的下一个节点为位序1。

解题思路(双指针(快慢指针)):

创建两个指针,for,lat,它们均指向头结点

for指针先走cnt步,此时,两个节点相差cnt个节点

for,lat指针同步往后移动,最后直至for==null

for 指针指向cnt+1(实际为null),lat此时与for相差cnt
说白了,就是不需要知道链表长度,指针1先走k步,然后指针2和指针1(相差k)同时前进,当指针1指向链表最后一个元素的下一位(即null)时,指针2即为所求。

代码实现:

复制代码
class Solution {
    public ListNode trainingPlan(ListNode head, int cnt) {
        ListNode former = head, latter = head; //创建双指针,初始化指向头结点
        for(int i = 0; i < cnt; i++) {       //for先走cnt步
            if(former == null) return null;  //防止cnt大于链表长度,直接返回null
                                            //(因为此时没求解的意义了)
               former = former.next;
        }
        while(former != null) {             //同时往后移动,直至for指针指向尾节点的下一位即null
            former = former.next;
            latter = latter.next;
        }
        return latter;
    }
}
代码优化:
复制代码
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode slow=head,fast=head;
        int t = 0;                               //加个变量t判断,代替第一个for循环
        while(fast!=null){
            if(t>=k) slow=slow.next;
            fast = fast.next;
            t++;
        }
        return slow;
    }
}

代码实现(方法1):

复制代码
class Solution {
    public ListNode trainningPlan(ListNode head, int cnt) {
        int n = 0;
        ListNode node = null;

        for (node = head; node != null; node = node.next) {
            n++;
        }
        for (node = head; n > cnt; n--) {
            node = node.next;
        }

        return node;
    }
}
相关推荐
贝壳6909 分钟前
一个2026年2月才上传的库,凭什么敢碰2009年就有人写烂的题目
算法
文丑颜不良啊33 分钟前
LeetCode2901~2920题目解析
java·leetcode
码云社区35 分钟前
能碳管理系统开发要关注什么?能源数据、统计口径与AI分析的衔接
java·人工智能·ai·能源·能源管理系统·能碳管理系统·能碳管理系统源码
贝壳69043 分钟前
同一道三亿位选型题,三个AI给了我三个答案,我把它们拉进同一台机器复跑
算法
Flynn Liang1 小时前
Agentic 工作流:子代理、Supervisor 与人工介入
java·langchain·多智能体·supervisor·agentic·langchain4j
xys_6781 小时前
JavaSE通关手册:运算符
java·java-ee
jyOverQ2 小时前
从零学 JVM(七):垃圾收集器详解——Serial、ParNew、Parallel、CMS 与 G1
java·jvm
liangbo72 小时前
Spring系列11:切点表达式
java·spring
3095566662 小时前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
nice_lcj5202 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam