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

94 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

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

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

示例

示例1:

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

难度:简单

此题为简单题,兄弟们可以重拳出击!

二、思路分析

众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。

题目解析

  1. 链表中倒数第 k 个节点,由于链表的特点,可以正向寻找而不能倒序寻找,因此想要寻找倒数第 k 个节点并不十分简单。
  2. 可以先进行以此链表的遍历,记录链表中节点的总数量 n,然后进行第二次链表遍历,遍历到 n-k +1 个就是倒数第 k 个节点。
  3. 还可以使用双指针解法,此种解法对于链表这种单向结构十分好用
    • 首先定义一个快指针在链表中先移动 k 次
    • 然后定义一个慢指针,与快指针同步移动
    • 当快指针移动到最后时,慢指针指向的结点就是倒数第 k 个结点

三、AC 代码

快慢指针

  • 链表种倒数第k个节点,使用双指针(速度相同,距离相差k),第一个先走 k 步,然后一起走
public ListNode getKthFromEnd(ListNode head, int k) {
    ListNode quick = head, slow = head;
    for(int i = 0; i < k; i++){
        quick = quick.next;
    }
    while(quick != null){
        quick = quick.next;
        slow = slow.next;
    }
    return slow;
}

image.png

四、总结

知识点

  • 双指针一般指左右指针或快慢指针,可以根据不同题目进行选择

最后

阳春三月,算法刷起来!LeetCode 剑指 Offer

简单题,不需要考虑太多,开干就是了。