题目描述
输入一个链表,输出该链表中倒数第k个结点。
分析:整体思路:“快慢指针”法
设立快慢两个指针,先让快指针走k步,到达位置后,快慢指针再同步移动;当快指针走到NULL时,慢指针所在的位置即为倒数第k个节点
主要注意的点:k>节点个数时,最开始fast指针前进k步while循环内一定要判断,fast已经走到NULL时,没必要继续走下去
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution
{
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
//1.让快指针先向后移动k
//2.让快慢指针同时向后移动,直到快指针走到NULL
//注意:特殊情况k大于链表中节点个数
ListNode*fast=pListHead;
ListNode*slow=pListHead;
//让快指针向后移动k步
while(k)
{
if(fast==NULL)//这里一定要判空,处理k大于链表中节点个数
{
return NULL;
}
fast=fast->next;
k--;
}
//让快慢指针同时向后移动,直到fast走到空
while(fast)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
};