链表中倒数第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;
    }
}
相关推荐
码云数智-园园5 小时前
C++ STL 容器怎么选?vector、list、map、unordered_map 优缺点对比
java·开发语言
en.en..5 小时前
竖线 |:管道、按位或、掩码组合
java·开发语言
程序猿乐锅6 小时前
【计算机组成原理 | 第六章】中央处理器 CPU
java·开发语言
大模型丫丫6 小时前
如何提升单体 Spring Boot 应用的并发数?
java·spring boot·后端
Terra.K6 小时前
ThreadLocal解决一个线程里面跨层传递问题
java·开发语言·后端
s_w.h6 小时前
【 刷题 】双指针
算法
啥都想学点的研究生6 小时前
一篇文章讲清楚:K-Means聚类算法
算法·kmeans·聚类
泡海椒6 小时前
低代码规则开发:JQuick-Java声明式配置驱动开发落地教程
java·低代码·rxjava
白狐_7986 小时前
408 数据结构|KMP做题方法:next、nextval和高频易错点
数据结构·算法
月华路6 小时前
《模型不玄学》第20章 两种评估视角
人工智能·算法·机器学习