Leetcode-链表中倒数第k个节点

举报
芒果_Mango 发表于 2022/03/28 10:37:31 2022/03/28
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/u...

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog
掘金LV3用户 https://juejin.cn/user/1381426159953960
阿里云社区专家博主,星级博主,技术博主 https://developer.aliyun.com/profile/expert/5lkdbuggiiuhc
华为云云享专家 https://bbs.huaweicloud.com/community/myhomepage

题目要求

链接链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)

image-20220210163227116


方法1:统计长度

思路

  • 第一步:遍历链表得出链表的长度,记为size,如果k大于链表的长度,不可能找到 。返回NULL
  • 第二步:==从头开始走 size - k 步==,就是倒数的第K个结点

从头开始走:倒数第K个结点的位置是正数的第size-k位置


代码

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    struct ListNode* cur = pListHead;
    //统计链表长度
    int size = 0;
    while(cur)
    {
        cur = cur->next;
        size++;
    }
    //如果k大于链表长度,不可能找到
    if(k > size)
    {
        return NULL;
    }
    
    int n = size-k;//倒数第K个结点的位置是正数的第size-k位置
    //从头开始走n步
    cur = pListHead;
    //cur走n步
    while(n--)
    {
      cur = cur->next;
    }
    return cur;
}

方法2:双指针

思路

  • 第一步:fast指针先走K步

    • ==注意:==如果走k步时:fast走到了NULL,说明k是比链表的长度大的,此时不可能找到倒数第K个结点 ->返回NULL

    • image-20220210163238163


    while(k--)  ==>循环k次 ->走k步
    while(--k)  ==>循环k-1->走k-1
  • 第二步:fast和slow一起走,当fast走到NULL时,slow就是倒数第K个结点(奇数个结点个或者偶数个结点都可以)


图解

image-20220210163251726


image-20220210163302628


代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    
    //定义双指针
    struct ListNode* fast = pListHead;
    struct ListNode* slow = pListHead;
    
    //fast 先走K步
    while(k--)
    {
        //k的大小大于链表长度, fast提前走到空
        if(fast == NULL)
        {
            return NULL;
        }
        fast = fast->next;
    }
    //fast和slow一起走
    //当fast走到NULL 此时slow就是倒数的第K个结点
    while(fast)
    {
        fast = fast->next;
        slow = slow->next;
    }
    return slow;
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。