实现一种算法,找出单向链表中倒数第 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;