算法热门:链表中倒数第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)的主要内容,如果未能解决你的问题,请参考以下文章