一、用递归方式、非递归方式写函数将一个字符串反转。
非递归方式: 这个是比较简单啦,注意到一半就得停住
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);
}
}