链表中倒数第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;
    }
}
相关推荐
Bazingga1 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff3 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3273 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
爱读书的小胖3 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌3 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
WJ.Polar3 小时前
Java封装、继承、多态
java·开发语言
ly76893 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠3 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
OPEN-F4 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_307779134 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab