解题思路(一):将总共有多少个元素(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>元素总个数那里;快慢指针的使用方法一定要会。