分析:使用两个指针,后一个指针先走k步,然后两个指针一起走,直到后一个指针走到最后一个元素。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (!pListHead || k == 0) {
return NULL;
}
ListNode* p_head = pListHead;
ListNode* p_tail = pListHead;
while(--k != 0) {
if (p_tail->next) // 特别注意这个条件// (1)
p_tail = p_tail->next;
else
return NULL;
}
while(p_tail->next != NULL) {
p_head = p_head->next;
p_tail = p_tail->next;
}
return p_head;
}
};
这里需要注意一点,上述代码加注释的地方,这里是为了防止一个越界的情况发生,即当链表的长度 < k时的情况。本人在刷这道题时反复通不过,就是一开始忽略了这个地方。