Leetcode刷题笔记之链表篇剑指 Offer 22. 链表中倒数第k个节点

Posted 大家好我叫张同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题笔记之链表篇剑指 Offer 22. 链表中倒数第k个节点相关的知识,希望对你有一定的参考价值。

😈博客主页:🐼大家好我叫张同学🐼
💖 欢迎点赞 👍 收藏 💗留言 📝 欢迎讨论! 👀
🎵本文由 【大家好我叫张同学】 原创,首发于 CSDN 🌟🌟🌟
精品专栏(不定时更新) 【数据结构+算法】 【做题笔记】【C语言编程学习】
☀️ 精品文章推荐
【C语言进阶学习笔记】三、字符串函数详解(1)(爆肝吐血整理,建议收藏!!!)
【C语言基础学习笔记】+【C语言进阶学习笔记】总结篇(坚持才有收获!)


前言

为什么要写刷题笔记
写博客的过程也是对自己刷题过程的梳理总结,是一种耗时有效的方法。
当自己分享的博客帮助到他人时,又会给自己带来额外的快乐和幸福。
(刷题的快乐+博客的快乐,简直是奖励翻倍,快乐翻倍有木有QAQ🙈)

题目内容

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有6个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3个节点是值为 4 的节点。

原题链接(点击跳转)

遍历链表法

单链表要求倒数第k个结点,由于结点之间关系的单向性,并不好直接求。但是如果我们将倒数转化为顺数,那么仅需要从头节点开始遍历链表便可轻松实现,具体过程看图解。

算法图解

函数实现
struct ListNode* getKthFromEnd(struct ListNode* head, int k)
    int length = 0;//求链表长度
    struct ListNode* cur = head;
    while(cur)
        length++;
        cur = cur->next;
    
    cur = head;//cur重新返回头节点
    int step = length-k;//第length+1-k个位置只需要向后走length-k步
    while(step--)
        cur = cur->next;
    
    return cur;

注意:leetcode题目中默认k的大小是小于length的长度。若实际中这个条件未给出,那么我们则需要加上以下条件判断的代码:

 if(k > length)
        return NULL;

比如在牛客网中没有这个判断就无法通过,会提示你段错误。

加上判断语句后

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
    // write code here
    int length = 0;//求链表长度
    int step = 0;
    struct ListNode* cur = pListHead;
    while(cur)
        length++;
        cur = cur->next;
    
    if(k > length)
        return NULL;
    cur = pListHead;//cur重新返回头节点
    step = length-k;//第length+1-k个位置只需要向后走length-k步
    while(step--)
        cur = cur->next;
    
    return cur;


快慢指针法

我们还可以用快慢指针法来求链表中倒数第k个结点,可以先让快指针fast先走k步,然后快慢指针(fast、slow)一起往后走,当快指针fast走到最后的NULL位置时,慢指针刚好走到倒数第k个位置。

算法图解

函数实现
struct ListNode* getKthFromEnd(struct ListNode* head, int k)
    struct ListNode *fast = head,*slow = head;
    while(k--)//fast先走k步
        fast = fast->next;
    
    while(fast)//fast、slow一起往后走
        fast = fast->next;
        slow = slow->next;
    
    return slow;


如果是在牛客网上做这道题目,那么我们使用快慢指针法的时候,还需要多考虑一些边界的情况,对上述代码进行相应调整如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
    struct ListNode *fast = pListHead,*slow = pListHead;
    if(k == 0)//这里加了k=0的条件判断
        return NULL;
    while(k--)//fast先走k步
        if(fast == NULL)//这里加了fast提前走到NULL的判断
        return NULL;
        fast = fast->next;
    
    while(fast)//fast、slow一起往后走
        fast = fast->next;
        slow = slow->next;
    
    return slow;

以上是关于Leetcode刷题笔记之链表篇剑指 Offer 22. 链表中倒数第k个节点的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题笔记之链表篇剑指 Offer 22. 链表中倒数第k个节点

Leetcode刷题笔记之链表篇234. 回文链表

Leetcode刷题笔记之链表篇141. 环形链表

Leetcode刷题笔记之链表篇160. 相交链表

Leetcode刷题笔记之链表篇160. 相交链表

Leetcode刷题笔记之链表篇234. 回文链表