算法热门:链表中倒数第k个结点(剑指Offer 22)

Posted 白龙码~

tags:

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

承上

上一篇博客(链表中间结点)我们介绍了求链表中间结点的方法并留下了一个思考问题:
在这里插入图片描述

review

简单回顾一下求中间节点的大概方法——利用快慢两个指针,快指针一次移动两个节点,慢指针一次移动一个节点,当快指针移动到链表尾或NULL时,我们的慢指针就会处在链表的中间位置;
如果我们想要倒数第k个结点呢?fast指针应该一次走几步?还是说,有另一种方式?

题目分析

话不多说,先看题:
在这里插入图片描述
函数参数包括链表头指针和整型k,要求我们返回第k个结点。
拿到这道题我们有两方面思考:
其一,是否存在倒数第k个结点,也就是说,这里的k是否会超过链表的长度?(LeetCode的题做多了下意识就会想到这一点)
其二,遍历两次链表依然是第一反应,那能否利用上一题的快慢指针做法进行一个时间复杂度上的改进呢?

题解

依然采取类比实例的方式:假设有两个人都要去某一个地方,他们在同一地点出发。
其中A先走了x公里之后,B再出发,假设他们速度相同。那么当A到达终点时,B距离终点多少公里?
答案很显然:x公里。
那么回到我们这个问题上来:我们让快慢指针都从链表的头出发,并且他们都是一次向前移动一个结点;当快指针先走了k次后,此时慢指针还在链表的头。这个时候他们俩再同时往链表尾走,当快指针走到表尾时,很显然,慢指针距离表尾还有k个节点的路程,此时,他就是倒数第k个节点了!

代码实现

struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    struct ListNode* fast=head,*slow=head;
     while(k--)
     {
         if(!fast)
         {
             return NULL;//k超出链表长度
         }
         fast=fast->next;
     }
     while(fast)
     {
         slow=slow->next;
         fast=fast->next;
     }
     return slow;
}

注意我们分析时提到的:k超过链表长度的那种情况!这种情况也涵盖了链表为空。
创作不易,留个点赞评论再走吧~关注博主,分享更多学习、刷题经验

以上是关于算法热门:链表中倒数第k个结点(剑指Offer 22)的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer(22) 链表中倒数第k个结点

剑指Offer对答如流系列 - 链表中倒数第k个结点

《剑指offer》第二十二题:链表中倒数第k个结点

《剑指offer》第二十二题(链表中倒数第k个结点)

《剑指offer》---输出链表倒数第k个结点

[剑指offer]面试题15:链表中倒数第k个结点