目录
前言
小伙伴们大家好啊!今天小编为大家带来一篇牛客网上有关链表的题目:链表中倒数第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。
好的,那么本文到此就结束啦!如有问题,还请指正呀!