输入一个链表,输出该链表中倒数第k个结点。
本题的思路是使用快慢指针实现,并且处理异常输入情况:k的值大于链表长度
时间复杂度:O(n),不管如何,都只遍历一次单链表
空间复杂度:O(1)
代码实现:
class Solution {
public:
//使用快慢指针,当快指针走到k之后,慢指针开始和快指针同步后移,直到快指针为空,慢指针就走到了倒数第k个结点
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(!pListHead||k<=0){
return nullptr;
}
ListNode *first=pListHead,*second=pListHead;
while(k--){//这个循环很重要,直接用k--控制循环次数
if(second){//如果second不为空
second=second->next;
}else{//用这种方式处理异常情况:k小于链表长度
return nullptr;
}
}
while(second){//second指针已经走到k位置,接下来慢指针与快指针同步运动直到快指针为空
second=second->next;
first=first->next;
}
return first;
}
};