描述
输入一个链表,输出该链表中倒数第k个结点。
示例1
输入:1,{1,2,3,4,5}
返回值:{5}
分析:
本题的思路是快慢指针的做法,快指针fast,慢指针slow。
当然,在确定快慢指针后。我们如何走呢?
思路一,可以先让快指针fast走k步,然后slow和fast同时可以进行同步走,直到fast指针指向NULL,为了方便理解,如图所示:
起始状态:假设k=4;
过程:fast快指针先走k步,如图所示:
然后fast和slow指针走到fast为NULL的时候:
代码实现:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param pListHead ListNode类
* @param k int整型
* @return ListNode类
*/
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
struct ListNode *slow=pListHead,*fast=pListHead;
if(pListHead==NULL){
return NULL;
}
while(k--){
if(fast==NULL){ //如果k的值大于链表结点的时候
return NULL;
}
fast=fast->next;
}
while(fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}
同样的思路我们还可以先让fast先走k-1步,然后fast和slow在同步走,直到fast走到最后一个结点:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param pListHead ListNode类
* @param k int整型
* @return ListNode类
*/
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
struct ListNode *slow=pListHead,*fast=pListHead;
if(pListHead==NULL){
return NULL;
}
while(--k){
if(fast->next==NULL){
return NULL;
}
fast=fast->next;
}
while(fast->next){
slow=slow->next;
fast=fast->next;
}
return slow;
}