题目:求解单链表中倒数第k个节点。
思路:
第一种方法:先遍历一遍单链表记录长度n,然后从头遍历n-k步即可(初始化为头结点)。
第二种方法,也是本文采用的方法。分别用两个指针,并保证两个指针的距离为k-1,如下图(k=3):
begin end
注意距离是k-1,然后两个指针同步执行,直至end到尾巴节点,需要处理的情况,是k是否大于链表长度。即start==null,这是因为我们通常习惯从倒数第1个节点称呼,而不是倒数第0个节点称呼。
下面是我实现的代码,欢迎各位批评指正。
/*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==NULL) return NULL;
ListNode* start=pListHead;
ListNode* end=pListHead;
for(int i=0;i<k-1;i++){
start=start->next;
if(start==NULL)
return NULL;
}
while(start->next!=NULL){
start=start->next;
end=end->next;
}
return end;
}
};