题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路
【快慢指针】
快指针先走k步,然后快慢指针一起走到结尾,这时候慢指针的next是所求节点
【注意】k超过链表长度,返回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) {
//快慢指针
if(pListHead == NULL || k == 0) return NULL;//注意这里unsigned,如果写<0会报错
ListNode* dummy = new ListNode(-1);
dummy -> next = pListHead;//插入假节点
//这题可以不插入假节点
ListNode* fast = dummy, *slow = dummy;//快慢指针指向假节点
for(int i = 0; i < k; i++){//注意这里终止条件,循环了k次【易错】第一次写了<=,就是k+1次
if(fast -> next) fast = fast -> next;//快指针先走k步
else return NULL;//k超出了链表长度
}
while(fast -> next){//快慢指针一起走
fast = fast -> next;
slow = slow -> next;
}
return slow->next;//
}
};