题目描述
输入一个链表,输出该链表中倒数第k个结点。
分析
用两个指针,第一个先向前跳k个节点,然后两个指针同时向后跳动,第一个指针到达末尾时候,第二个指针就指向倒数第k个节点了。
也可以用递归,用一个变量计数。
代码实现
/递归版本
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode*p = NULL;
int i = 0;
recur( pListHead, i, k,p);
return p;
}
void recur(ListNode* head,int & i,int k,ListNode*&p){
if(head==NULL){
i=0;
p==NULL;
return ;
}
else
{
recur(head->next,i,k,p);
i++;
if(i==k)
p = head;
}
}
ListNode*p = NULL;
int i = 0;
recur( pListHead, i, k,p);
return p;
}
void recur(ListNode* head,int & i,int k,ListNode*&p){
if(head==NULL){
i=0;
p==NULL;
return ;
}
else
{
recur(head->next,i,k,p);
i++;
if(i==k)
p = head;
}
}
/两个指针版本
ListNode* FindKthToTail2(ListNode* pListHead, unsigned int k) {
ListNode*p =pListHead,*q =pListHead;
if(p==NULL)return NULL;
int i;
for( i=0 ;i<k&&p!=NULL;i++){
p=p->next;
}
if(i<k)return NULL;
while(p!=NULL){
p=p->next;
q=q->next;
}
return q;
}
ListNode* FindKthToTail2(ListNode* pListHead, unsigned int k) {
ListNode*p =pListHead,*q =pListHead;
if(p==NULL)return NULL;
int i;
for( i=0 ;i<k&&p!=NULL;i++){
p=p->next;
}
if(i<k)return NULL;
while(p!=NULL){
p=p->next;
q=q->next;
}
return q;
}