法一:遍历两次,第一次数出有几个结点,第二次遍历到n-k时return。结果:回家等通知
法二:类似一把尺子,可以叫他前后指针(快慢指针不准确),先让一个指针走k-1步,然后另一个指针指向头结点0。当快指针走到尾结点时,慢指针刚好走到n-k的位置。因为快慢指针差的距离刚好是k-1。假设结点有n个,那么最后一个结点的位置是n-1,减去k-1刚好是n-k。
但是还是拿不到offer,因为你完全没有考虑鲁棒性
还有三点必须进行判断
1.头结点是否为空结点,如果为空,那么我们会试图访问空指针的内存
2.结点总数小于k,那么在快指针走k-1步时会直接崩溃,所以在快指针走时要判断下一个结点是否为空,不为空才等于next
3.k<=0,直接崩溃。
总之就是检查输入数据的合法性。
/*
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;
}
ListNode* pre = pListHead;
ListNode* last = pListHead;
for(int i = 1; i < k; i++){
if(pre->next != NULL){
pre = pre->next;
}
else{
return NULL;
}
}
while(pre->next != NULL){
pre = pre->next;
last = last->next;
}
return last;
}
};