牛客网:链表中倒数第 k 个节点

目录

前言

题目

规律总结

思路

步骤一:

 步骤二:

 步骤三:

代码实现


前言

小伙伴们大家好啊!今天小编为大家带来一篇牛客网上有关链表的题目:链表中倒数第k个节点。

题目

如下图所以。其实该题目,我们仔细看的话,可以发现,也就是单链表查找节点,只不过是有一点变形的,因为这里不是单纯的查找第几个,而是倒数第几个节点。

然后题目中也表明,涉及到了双指针问题,其实很多单链表的题目都是需要双指针来完成的。

规律总结

因为需要返回的是倒数第k个节点,所以我们用两个指针 fast 和 slow,两个指针之间的距离是 k ,然后将这两个指针一起移动,当快指针 fast 移动到最后一个节点后面的 NULL 时,此时慢指针slow的位置正好是倒数第 k 个位置。

其实原理就是,将最后时刻的 fast 指针当做第 0 个节点,然后 slow 指针的位置就是顺数第 k 个节点,也即是单链表的查找。

思路

根据上面的规律,我们有以下三个步骤。

步骤一:

首先,我们需要将两个指针分别指向间距为 k 的两个节点上,当然慢指针 slow 必须指向首节点。

 步骤二:

然后就是中间的步骤了:两个指针一起移动,保证距离不变。

 步骤三:

一直移动直到快指针 fast 出界,此时返回慢指针的节点即可。

 所以,这三个步骤在一个循环中,而且循环的条件是快指针不为空。

代码实现

这里代码其实是在C++的环境下写的,但是因为C++兼容C的语法规则,所以用c语言写是一样的。

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    struct ListNode*fast=pListHead;
    struct ListNode*slow=pListHead;
    if(pListHead==NULL && k==0)
    {
        return NULL;
    }
    while(k--)
    {
        if(fast)
        {
           fast=fast->next;   
        }
        else
        {
            return NULL;
        }
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

然后对于该代码,有一些限制条件可能一下子我们想不到,但是通过提交代码,我们发现,如果出链表为空,或者链表不为空,但是返回的第 0 个节点,此时,我们需要返回 NULL。

好的,那么本文到此就结束啦!如有问题,还请指正呀!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值