方法:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param pListHead ListNode类
* @param k int整型
* @return ListNode类
*/
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
// write code here
struct ListNode* slow = pListHead, *fast = pListHead;
while (fast != NULL) {
while (k > 0) {
fast = fast->next;
k--;
if(fast == NULL)
{
return k == 0 ? slow : NULL;
}
}
slow = slow->next;
fast = fast->next;
}
return slow;
}
思路:
快慢指针思想,想要找到倒数第k个节点,那么可以创建两个指针slow和fast。初始时两个指针指向头节点,然后让fast先走k步,之后两个指针再同时走,当fast走到尾时,slow就是倒数第k个。
需要注意两种情况:一是k等于链表长度,此时fast会提前走到尾,标志是此时k等于0,返回头节点即可。二是k大于链表长度,此时fast会提前走到尾,标志是此时k大于0,返回空即可。