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


    1. 题目

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

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

     2. 示例

    给定一个链表: 1->2->3->4->5, 和 k = 2.
    返回链表
    4->5.

     3. 题解

    本题给了两种解法。

    • 两次查找:先计算总节点个数,然后输出再次遍历到n - k + 1,然后输出。
    • 快慢指针:先让快指针走到k步,然后快慢指针同时走,快指针走到尾时,满指针刚好到达倒数k位置。

    4. 实现

     1 class Solution {
     2     // 两次查找
     3     public ListNode getKthFromEndA(ListNode head, int k) {
     4         if(head == null) return null;
     5         ListNode temp = head;
     6         int n = 0;
     7         // 第一遍计数
     8         while (temp != null) {
     9             n++;
    10             temp = temp.next;
    11         }
    12         // 如果k > n,说明所有的都满足条件
    13         if(k >= n) {
    14             return head;
    15         }
    16         // 遍历到n - k + 1,直接打印
    17         int cur = 1, dis = n - k + 1;
    18         while(cur <= dis) {
    19             if(cur == dis) {
    20                 return head;
    21             }
    22             head = head.next;
    23             cur++;
    24         }
    25         return head;
    26     }
    27     // 快慢指针
    28     public ListNode getKthFromEndB(ListNode head, int k) {
    29         // 定义快慢指针
    30         ListNode frontNode = head, behindNode = head;
    31         // 快指针先走k步
    32         while (frontNode != null && k > 0) {
    33             frontNode = frontNode.next;
    34             k--;
    35         }
    36         // 快慢指针同时走,他们的距离刚好为k,当快指针走到尾时,结束。
    37         // 此时满指针刚好走到倒数倒数第k个节点。
    38         while (frontNode != null) {
    39             frontNode = frontNode.next;
    40             behindNode = behindNode.next;
    41         }
    42         return behindNode;
    43     }
    44 }
    View Code

    5. 结语

      努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

      如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

    但行好事 莫问前程
  • 相关阅读:
    设计模式(六)Prototype Pattern 原型模式
    设计模式(五)Builder Pattern建造者模式
    Linux安装软件
    日志技术及JUL入门
    IDEA推出新字体,极度舒适
    HDFS的API操作
    Apollo的灰度发布
    Apollo整合SpringBoot开发
    Apollo配置发布原理
    Apollo应用配置
  • 原文地址:https://www.cnblogs.com/haifwu/p/14980080.html
Copyright © 2020-2023  润新知