C/C++面试程序题(二)——找中点、倒数n点、判断是否循环

 一、一个单链表,不知道长度,写一个函数快速找到中间节点的位置。

 

 

    物理中有这样一个事实,速度相差一倍的两辆车同时出发,慢车总是在路程的中点。所以就利用这个原理写了下面这个程序。

 

node* findmiddle(node *head){
    node* v,*v2;
    if(!head){
        return NULL;
    }
    v2=v=head;
    while(v2->next && v2->next->next){
        v=v->next;
        v2=v2->next->next;
    }
    return v;
}


 

 

 二、写一个函数找出一个单向链表的倒数第n个节点的指针.

 

node* lastnode(node* head,int n){
    int i;
    if(!head){
        return NULL;
    }
    node *p=head;
    node *res=head;
    for(i=0;i<n;i++){
        if( p->next!= NULL){
            p=p->next;
        }else{
            return NULL;
        }
    }
    while(p){
        p=p->next;
        res=res->next;
    }
    return res;
}


 

三、判断一个链表是否循环

 

       这和判断一个链表是否为循环链表是不一样的。循环链表一定是尾指头,循环的链表可就不一定了,可能在中间某处循环了。

 

    判断循环链表:

 

int isloop(node *head){
    node*p=head;
    if(p->next){    //有一个元素
        p=p->next;
    }else{
        return 0;
    }
    while(p && p != head){
        p=p->next;
    }
    if(!p){
        return 0;
    }else{
        return 1;
    }
}


 

判断链表循环:

 

int isloop(node *head){
    node* v,*v2;
    v=v2=head;
    if(head->next){
        v2=head->next;
    }else{
        return 0;
    }
    while(v2->next && v2->next->next && v != v2){
        v=v->next;
        v2=v2->next->next;
    }
    if(v==v2){
        return 1;
    }else{
        return 0;
    }
}

 

 


 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值