c++试题(1)
2016-03-08 16:58
543 查看
递归的本质就是栈!!!
递归:由外向里递归执行
将A和I交换,此时变成 IBCDEFGHA,此时递归的字符串应该变成其子串“BCDEFGH”
可以反序输出链表,不改变结构
也可以递归反转
非递归:
另一种解法
/article/1802479.html
一、用递归方式、非递归方式写函数将一个字符串反转
非递归:char* reverse(char *str){ if(str != NULL){ int length=strlen(str); int i; char temp; //中间即停止,len=1的情况直接返回,奇数的情况中间不动 for(i=0;i<length/2;i++){ temp=str[i]; //尾=len-1-i str[i] = str[length-1-i]; str[length-1-i] = temp; } } return str; }
递归:由外向里递归执行
将A和I交换,此时变成 IBCDEFGHA,此时递归的字符串应该变成其子串“BCDEFGH”
void reverse(char* p, int N){ { if(p != NULL && N != 0){ if (N == 1) return; else { char ch = p[0]; p[0] = p[N-1]; p[N - 1] = ch; Func(p+1, N - 2); } } }
二、用递归方式、非递归方式写函数将链表反转
递归:可以反序输出链表,不改变结构
void oppdisplay(node* head){ if(head==NULL || head->next==NULL) return head; else{ oppdisplay(head->next); //从后往前输出 printf("%d ",head->data); } }
也可以递归反转
void Inversion_Recursion(ListNode* p,ListNode* Head) { if(p->next==NULL) { Head->next=p; return;//找到最后一个节点作为头结点的后继 } Inversion_Recursion(p->next,Head); //从后往前开始反转 p->next->next=p;//反转节点 p->next=NULL;//第一个节点反转后其后继应该为NULL }
非递归:
node* opposite(node* head){ node *before,*middle,*after; before = NULL; if(!head){ return NULL; } //Header-结点1-结点2-结点3-结点4-NULL middle=head; //Header-结点2-结点1-结点3-结点4-NULL... while(middle != NULL){ after = middle->next; middle->next = before; before = middle; middle = after; } return before; }
另一种解法
/article/1802479.html
三、未知长度的单链表,快速找到中间节点的位置
依然是常用的双指针技巧node* find_middle(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==NULL || head->next==NULL) return head; 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; }
五、判断链表是否循环
依然使用双指针,一个每次移动一格,一个移动两格,若有循环一定会在某处相遇bool isloop(node *head){ node* v,*v2; v=v2=head; //处理特殊输入 if(!head){ return NULL; } if(head->next){ v2=head->next; }else{ return false; } //移动 while(v2->next && v2->next->next){ v=v->next; v2=v2->next->next; if(v==v2) return true; else return false; } }
相关文章推荐
- C语言堆和栈区别(十)
- VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)
- C++学习网站
- c/c++中的预编译指令总结
- C++的一些干货,有各种c++的资料
- C++内存分区以及堆内存和栈内存
- c++ 组合模式
- C++输入cout与输出cin
- C++继承中关于子类构造函数的写法
- C++之内部类与外部类(嵌套类)及友元
- C++ 嵌套类使用(三)
- C++ 嵌套类使用(二)
- C++ 嵌套类使用(一)
- C语言strtok()函数:字符串分割
- 细谈select函数(C语言)
- C++之tinyXML的使用详解
- VC++动态链接库(DLL)编程深入浅出
- c++ 观察者模式
- C语言-表达式
- c++ 访问者模式