解题思路(一):将总共有多少个元素(count)统计出来,倒数第k个元素就是(count -k)个元素,其中要判断是否开始就为NULL,总个数有没有大于k,k是否为正数。将倒数的转换为正数
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(!pListHead|| k<=0) return NULL;
ListNode* two = pListHead;
ListNode* cur = pListHead;
int count = 0;
while(cur){
cur = cur->next;
++count;
}
if(k>count){
return NULL;
}
else{
count -= k;
while(count--){
two = two->next;
}
return two;
}
}
};
解题思路(二):还是利用快慢指针,当快指针出发了k步之后,慢指针出发,两个指针每次都移动一个步数
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(!pListHead|| k<=0) return NULL;
ListNode* fast = pListHead;
ListNode* low = pListHead;
while(k--){
//这里要判断k是否<元素总个数
if(fast){
fast = fast->next;
}
else{
return NULL;}
}
while(fast){
fast = fast->next;
low = low->next;
}
return low;
}
};
这个解题思路没啥难的,但是有很多小的细节,比如在判断k>元素总个数那里;快慢指针的使用方法一定要会。