解法1:单指针,两次遍历
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
if (head == NULL || k <= 0)
return NULL;
int cnt = 0;
struct ListNode* ptr = head;
while (ptr) { //计算长度
ptr = ptr->next;
cnt++;
}
if (k > cnt)
return NULL;
if (k == cnt)
return head; //特殊情况处理
cnt -= k;
ptr = head;
while (cnt--)
ptr = ptr->next;
return ptr;
}
解法2:双指针,一次遍历
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
if (head == NULL || k <= 0)
return NULL;
struct ListNode* slow = head;
struct ListNode* fast = head;
while (k--) {
if (fast)
fast = fast->next;
else
return NULL;
}
while (fast) { //直至fast移至空结尾
slow = slow->next;
fast = fast->next;
}
return slow;
}
注:如果对移动的次数是k,或者k-1,或者cnt-k有疑虑,不妨自己弄一个测试例按照自己的判断条件走一下就可以了。