C/C++面试程序题(一)——字符串反转、链表反转的递归、非递归实现

一、用递归方式、非递归方式写函数将一个字符串反转。

 

   非递归方式:   这个是比较简单啦,注意到一半就得停住

 

char* reverse(char *str){
    if(str != NULL){
        int length=strlen(str);
        int i;
        char temp;
        for(i=0;i<length/2;i++){
            temp=str[i];
            str[i] = str[length-1-i];
            str[length-1-i] = temp;
        }
    }
    return str;
}

 

    递归方式: 这个为了符合函数的声明硬写了一个递归的方法,挺别扭,求高手指点敲打

 

char* reverse2(char *str){
    static int passed=0;    //全局变量只声明一次
    char temp;
    if(*str == '\0'){
        return NULL;
    }else{
        passed++;
        temp = *str;   //保存一个量要不回来就找不到了

        reverse2(str+1);

        if(passed>0){
            *str = *(str-passed+1);
            *(str-passed+1)=temp;
            passed=passed-2;    //因为指针也会向前移动所以有两个偏移量
        }
        return str;
    }
}

 

二、用递归方式、非递归方式写函数将链表反转

 

    非递归方式: 采用前、中、后的方式移动指针

 

node* opposite(node* head){
    node *before,*middle,*after;
    before = NULL;
    if(!head){
        return NULL;
    }
    middle=head;
    while(middle != NULL){
        after = middle->next;
        middle->next = before;
        before=middle;
        middle = after;
    }

    return before;
}

 

    递归调用:就这么地吧,正常的递归就应该这么写。只是反序输出,没有改变存储结构。

 

void oppdisplay(node* head){
    if(!head){
        return ;
    }else{
        oppdisplay(head->next);
        printf("%d ",head->data);
    }
}





 

你可能感兴趣的:(面试,null,存储)