当前位置: 首页 > news >正文

链表中倒数第K个节点 -- java

题目描述

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

节点定义如下:

public class ListNode {
    int value;
    ListNode next = null;

    public ListNode() {
    }

    public ListNode(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "value=" + value +
                '}';
    }
}

测试用例

  • 功能测试(第k个节点在链表的中间;第k个节点是链表的头结点;第k个节点是链表的尾结点)
  • 特殊输入测试(链表头结点为空指针;链表的节点总数少于k;k=0)

解题思路

定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1步,当第一个指针到达链表的尾节点时,第二个指针正好指向倒数第k个节点。

k-1可以这么理解:倒数第一个节点和尾结点的距离是0,倒数第二个节点和尾结点的距离是1,所以倒数第k个节点和尾结点的距离是k-1。

但是为了保持程序的鲁棒性,需要考虑下面三个问题:

  • 输入头节点为空指针
  • 链表的节点总数少于k
  • 输入k为0

代码

public class FindKthToTail {
    public static ListNode findKthToTail(ListNode head, int k) {
        // 防止空指针和k=0无意义
        if (head == null || k == 0) {
            return null;
        }

        // 第一个指针的步数
        int i = 0;
        // 初始化两个指针
        ListNode firstNode = head;
        ListNode secondNode = head;

        while (firstNode.next != null) {
            firstNode = firstNode.next;
            i++;
            // 保持两个指针距离为k-1
            if (i > k-1) {
                secondNode = secondNode.next;
            }
        }

        // 还没走到k-1步就结束了
        // 表示链表的节点总数少于k
        if (i < k-1) {
            return null;
        }

        return secondNode;
    }

    // 测试
    public static void main(String[] args) {
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;


        System.out.println(findKthToTail(node1, 1)); // 倒数第1个节点
        System.out.println(findKthToTail(node1, 3)); // 倒数第3个节点
        System.out.println(findKthToTail(node1, 5)); // 倒数第5个节点


        System.out.println(findKthToTail(null, 1)); // 头结点为null
        System.out.println(findKthToTail(node1, 6)); // 节点总数小于k
        System.out.println(findKthToTail(node1, 0)); // k等于=
    }
}

补充

鲁棒性是指程序能够判断输入是或否合乎规范要求,并对不符合要求的输入予以合理的处理。

容错性 是鲁棒性的一个重要体现。

提高代码的鲁棒性的有效途径是进行防御性编程,防御性编程是一种编程习惯,是指预见在什么地方可能会出现问题,并为这些可能出现的问题制定处理方式。

解题思路
当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。可以让其中一个指针遍历的速度快一些(比如一次在链表上走两步),或者让它在链表上走若干步。


来自:
《剑指Offer》
Coding-Interviews/链表中倒数第K个节点.md at master · todorex/Coding-Interviews

相关文章:

  • Mac查看npm安装位置
  • idea env: node: No such file or directory
  • 链表中环的入口节点 -- java
  • 反转链表 -- java
  • 合并两个排序的链表 -- java
  • Mac上使用宁芝普拉姆键盘的记录
  • idea Mac格式化代码快捷键
  • 搜狗输入法关闭候选词中的图标只显示文字
  • Mac关闭idea的双击shift全局搜索功能
  • 树的子结构 -- java
  • 二叉树的镜像 -- java
  • java 遍历二叉树使用循环方式
  • 隐藏csdn博客的标题X条消息的方式
  • 对称的二叉树 -- java
  • 顺时针打印矩阵 -- java
  • [PHP内核探索]PHP中的哈希表
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Netty源码解析1-Buffer
  • 力扣(LeetCode)965
  • 三栏布局总结
  • 提醒我喝水chrome插件开发指南
  • 怎么将电脑中的声音录制成WAV格式
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #define、const、typedef的差别
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C#)获取字符编码的类
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (ZT)一个美国文科博士的YardLife
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (转)fock函数详解
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)从 Java 代码到 Java 堆
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net反混淆脱壳工具de4dot的使用
  • @Pointcut 使用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Valid和@NotNull字段校验使用
  • [.net] 如何在mail的加入正文显示图片
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C++]C++基础知识概述
  • [IOI2018] werewolf 狼人
  • [iOS开发]事件处理与响应者链
  • [js] 正则表达式
  • [one_demo_4]不使用第3个变量交换两个变量的值
  • [OpenAI]继ChatGPT后发布的Sora模型原理与体验通道
  • [OpenGL(Win32)] - 3D 轮廓字体
  • [saiku] olap数据源管理