题目描述

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

思路分析

  1. 采用双指针的方法,第一个指针首先向前移动k-1个位置,第二个指针指向头节点,然后将两个指针同时向后移动,如果第一个指针走到链表尾结点时,第二个指针的位置就正好为 倒数第k个节点

测试用例

  1. 功能测试:第k个节点在链表的中间;第k个节点是链表的头节点;第k个节点是链表的尾节点。
  2. 特殊输入测试:链表头节点为nullptr指针:链表的节点总数少于k;k等于0。

Java代码

  1. public class Offer22 {
  2. public static void main(String[] args) {
  3. test1();
  4. test2();
  5. test3();
  6. test4();
  7. }
  8. public static ListNode FindKthToTail(ListNode head, int k) {
  9. return Solution1(head, k);
  10. }
  11. /**
  12. * 双指针的方法
  13. * @param head
  14. * @param k
  15. * @return
  16. */
  17. private static ListNode Solution1(ListNode head, int k) {
  18. if (head == null || k == 0) {
  19. return null;
  20. }
  21. ListNode pBefore = head;
  22. ListNode pBeHind = null;
  23. for (int i = 0; i < k - 1; i++) {
  24. if (pBefore.next != null) {
  25. pBefore = pBefore.next;
  26. } else {
  27. return null;
  28. }
  29. }
  30. pBeHind = head;
  31. while (pBefore.next != null) {
  32. pBefore = pBefore.next;
  33. pBeHind = pBeHind.next;
  34. }
  35. return pBeHind;
  36. }
  37. private static void test1() {
  38. ListNode head = new ListNode(1);
  39. ListNode node2 = new ListNode(2);
  40. ListNode node3 = new ListNode(3);
  41. ListNode node4 = new ListNode(4);
  42. head.next = node2;
  43. node2.next = node3;
  44. node3.next = node4;
  45. ListNode kthNode = FindKthToTail(head, 4);
  46. System.out.println("{1,2,3,4},4 ---> " + kthNode.val);
  47. }
  48. private static void test2() {
  49. ListNode head = new ListNode(1);
  50. ListNode node2 = new ListNode(2);
  51. ListNode node3 = new ListNode(3);
  52. ListNode node4 = new ListNode(4);
  53. head.next = node2;
  54. node2.next = node3;
  55. node3.next = node4;
  56. ListNode kthNode = FindKthToTail(head, 5);
  57. if (kthNode == null) {
  58. System.out.println("{1,2,3,4},5---> null ");
  59. } else {
  60. System.out.println("测试失败!");
  61. }
  62. }
  63. private static void test3() {
  64. ListNode head = new ListNode(1);
  65. ListNode node2 = new ListNode(2);
  66. ListNode node3 = new ListNode(3);
  67. ListNode node4 = new ListNode(4);
  68. head.next = node2;
  69. node2.next = node3;
  70. node3.next = node4;
  71. ListNode kthNode = FindKthToTail(head, 0);
  72. if (kthNode == null) {
  73. System.out.println("{1,2,3,4},0---> null ");
  74. } else {
  75. System.out.println("测试失败!");
  76. }
  77. }
  78. private static void test4() {
  79. ListNode head = null;
  80. ListNode kthNode = FindKthToTail(head, 4);
  81. if (kthNode == null) {
  82. System.out.println("{null},4---> null ");
  83. } else {
  84. System.out.println("测试失败!");
  85. }
  86. }
  87. }

代码链接

剑指Offer代码-Java

【Offer】[22] 【链表中倒数第k个结点】的更多相关文章

  1. 【Java】 剑指offer(22) 链表中倒数第k个结点

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的 ...

  2. 剑指Offer:链表中倒数第k个结点【22】

    剑指Offer:链表中倒数第k个结点[22] 题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思考 我们定义两个指针L和R,R事先移动K-1个位置,然后两者同时往后移动直到遇到R的下个节点为 ...

  3. 剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 Offer 22 常规解法 常规解法其实很容易可以想到,只需要先求出链表的长度,然后再次遍历取指定长度的链接即可. package com.walega ...

  4. 力扣 - 剑指 Offer 22. 链表中倒数第k个节点

    题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...

  5. LeetCode 剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 题意 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. ​ 例如,一个链表有 6 个 ...

  6. Go语言实现:【剑指offer】链表中倒数第k个结点

    该题目来源于牛客网<剑指offer>专题. 输入一个链表,输出该链表中倒数第k个结点. Go语言实现: type ListNode struct { Val int Next *ListN ...

  7. 剑指offer:链表中倒数第k个结点

    问题描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 两个指针都指向头结点,第一个指针先移动k-1个结点,之后两指针同时移动,当第一个指针到链表尾的时候,第二个指针刚好指向倒数第k个结点. ...

  8. 剑指Offer 14. 链表中倒数第k个结点 (链表)

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目地址 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?t ...

  9. 剑指offer例题——链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 编程过程 此处采用两个指针依次后移的方法来求解,首先,用一个指针移到第k个位置,之后将第二个指针放在第一位,与第二个指针一同移动,当第二个指针移动 ...

  10. 《剑指offer》链表中倒数第k个结点

    一.题目描述 输入一个链表,输出该链表中倒数第k个结点. 二.输入描述 一个链表 三.输出描述 链表的倒数第k个结点 四.牛客网提供的框架 /* struct ListNode { int val; ...

随机推荐

  1. C#打开并选择特定类型文件并返回文件名

    public string[] GetOpenFileDialogReturnFileFullName(bool multiSelect = false)         {             ...

  2. echarts3.x 入门

    echarts 使用 1.getStart 1.1引入 echart <!-- 引入 ECharts 文件 --> <script src="echarts.min.js& ...

  3. Assign the task HDU - 3974 (dfs序 + 线段树)

    有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...

  4. abap简单实现form递归

    需求:根据物料号查询下层物料清单 DATA LV_MATNR LIKE ZMARA_TEST-MATNR VALUE '000000000000000001'. DATA: LT_MAT LIKE T ...

  5. Javascript中,实现类与继承的方法和优缺点分析

    Javascript是一种弱类型语言,不存在类的概念,但在js中可以模仿类似于JAVA中的类,实现类与继承 第一种方法:利用Javascript中的原型链 //首先定义一个父类 function An ...

  6. 【win10主机】连接virtualbox上【32位winXP系统虚拟机】上启动的mysql

    问题Q: 在virtualbox上启动winXP系统虚拟机后,启动含oa项目的tomcat,数据库服务也运行起来了,虚拟机上连接无误: 在上一篇<主机访问 虚拟机启动的项目>基础上,尝试连 ...

  7. SpringBoot与Shiro整合权限管理实战

    SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...

  8. Spring Boot 默认指标从哪来?

    了解有关 Spring Boot 默认指标及其来源的更多信息. 您是否注意到 Spring Boot 和 Micrometer 为您的应用生成的所有默认指标? 如果没有 - 您可以将 actuator ...

  9. Java8中Instant和LocalDate来计算时间或者日期间隔

    /** * java.time.Instant * java.time.Duration * Instant 默认使用UTC时区:2019-01-24T14:01:32.258Z * mongo中的时 ...

  10. 随笔编号-16 JAVA知识框架

    基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1  JAVA简介 2  JAVA编程环境 3  JAVA基本编程结构 4 ...