【leetcode天梯】链表 · 022 链表中倒数第k个节点

题目描述:

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

示例 1:

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

输入:head = [1,2,3,4,5] , k=2
输出:[4,5]

示例 2:

输入:head = [1,2,3,4,5] , k=100
输出:[]

示例 3:

输入:head = [] , k=1
输出:[]

题目链接:

剑指 Offer 22. 链表中倒数第k个节点 - 力扣(LeetCode)icon-default.png?t=M666https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=M666https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

这边牛客网的检验事例更多,推荐各位使用牛客暴刷!


解题思路:

常规法1:早晚指针

这是一种非常经典的做法,是快慢指针做法的变形操作。我们设置两个指针,其中指针late比指针early早走k步,然后让指针early与指针late共同向后遍历,当指针late指向NULL时,指针early指向的结点恰好就是倒数第k个结点。

struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    struct ListNode* late = head;
    struct ListNode* early = head;
    while(k--)
    {
        if(late!=NULL) //当late不为空时,late一直向后走
            late=late->next;
        else
            return NULL;//当未走满k步late就已经走到NULL时,直接返回NULL,得不到倒数第k个结点
    }
    while(late) //late指针与early指针一直走到late指针指向空时才停止
    {
        early=early->next; //early向后走一步
        late=late->next; //late向后走走一步
    }
    return early;
}

扫描二维码关注公众号,回复: 14389945 查看本文章

总结一下:这是非常典型的快慢指针问题,相信各位看一遍就能记住这种方法,非常经典好用!

猜你喜欢

转载自blog.csdn.net/qq_54151955/article/details/125948291