单链表---返回倒数第k个结点

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

之前讲到过找出单链表中间结点的题目,那么对于本题,与找出中间结点有着异曲同工之妙。

找中间结点,本质上是时间上,快慢指针相差一步,从而快指针走到尾,慢指针能够在中间结点的位置;那么找倒数第k个结点,那么该结点与尾结点的距离为k-1,本质是在距离上要使俩指针隔开k-1,那么当fast指针指向尾结点,slow指针就指向倒数第k个结点。

    struct ListNode* slow=head;
    struct ListNode* fast=head;

那么我们先让fast指针走k-1步,然后让fast与slow以相同速度走,直到fast走到尾结点,那么返回slow->val即可。

fast走k-1步:如果设定的k过大,超过链表长度,那么我们直接返回-1。

    while(--k)
    {
        if(fast == NULL)
            return -1;
        fast = fast->next;
    }

slow与fast一同走,直到fast->next==NULL:

    while(fast->next)
    {
        fast = fast->next;
        slow = slow->next;
    }

那么最后返回slow。

如上图,使用右侧的思路也是没有问题的,如下所示:

    while(k--)
    {
        if(fast == NULL)
            return -1;
        fast = fast->next;
    }
    while(fast)
    {
        fast = fast->next;
        slow = slow->next;
    }
    return slow->val;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值