您当前的位置: 首页 >  链表

TechGuide

暂无认证

  • 2浏览

    0关注

    176博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【每日一题】JZ14 链表中倒数最后k个结点

TechGuide 发布时间:2021-09-05 19:45:05 ,浏览量:2

当你的才华还撑不起你的野心时,你应该静下心去学习 。 题目描述

输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。

如果该链表长度小于k,请返回一个长度为 0 的链表。

输入:{1,2,3,4,5},1 
输出:{5}
解题思路

依然双指针(昨天是首尾双指针,今天是快慢指针):

第一时间想到的解法就是,先遍历统计链表长度,记为 n ,再设置一个指针走 n−k 步,即可找到链表倒数第 k 个节点。

再优化一点的方法就是一次遍历:

  1. 初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head​ 。
  2. 构建双指针距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。
  3. 双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter 指向倒数第 k 个节点)。
  4. 返回值: 返回 latter 即可。

时间复杂度 O(N) : NN 为链表长度;总体看, former 走了 N 步, latter 走了 (N−k) 步。 空间复杂度 O(1) : 双指针 former , latter 使用常数大小的额外空间。

参考代码 Java版本
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode former = head, latter = head;
        for(int i = 0; i  0) {
            fast = fast->next;
            k--;
        }
        while (fast) {
            fast = fast->next;
            slow = slow->next;
        }

        return slow;
    }
}
// 关注TechGuide,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍
关注
打赏
1665329535
查看更多评论
立即登录/注册

微信扫码登录

0.0388s