题目
输入一个链表,输出该链表中倒数第k个结点。
分析
类似于链表的中间节点,我们采用快慢指针通过遍历一次链表解决这个问题。我们要找的是倒数第k个节点,倒数第k个节点和最后一个节点距离是k-1。由此,如果快指针和慢指针相距k-1个节点,当快指针到达最后一个节点的时候,慢指针刚好到达倒数第k个节点。所以我们设立两个指针,快指针先走k-1步,然后两个指针同时开始走,当快指针到末尾的时候,慢指针到达目的地。
//如果链表为空
if(pListHead==NULL||k==0)
return NULL;
ListNode *fast=pListHead;
ListNode *slow=pListHead;
while(k-1>0)
{
fast=fast->next;
//说明长度不足Kk
k--;
if(fast==NULL)
return NULL;
}
//差距k-1
//同时开始走
while(fast->next!=NULL)
{
fast=fast->next;
slow=slow->next;
}
return slow;
为了保证鲁棒,我们需要讨论边界的情况:
- 头节点为空 或者k=0
- k大于链表的长度
以上情况都需要返回NULL.