c++试题(1)
来源:互联网 发布:淘宝首页资源位 编辑:程序博客网 时间:2024/05/01 11:31
递归的本质就是栈!!!
一、用递归方式、非递归方式写函数将一个字符串反转
非递归:
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; reverse(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 }
非递归:
ListNode* ReverseList(ListNode *pHead){ ListNode *pReverseHead = NULL; ListNode *pNode = NULL; ListNode *pPre = NULL; while(pNode != NULL){ ListNode *pNext = pNode->next; if(pNext == NULL) pReverseHead = pNode; pNode->next = pPre; pPre = pNode; pNode = pNext; } return pReverseHead;}
另一种解法
http://blog.csdn.net/kangroger/article/details/20237081
三、未知长度的单链表,快速找到中间节点的位置
依然是常用的双指针技巧
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; } }
0 0
- c面试题1
- C/C++面试题1
- 嵌入式C面试题1
- C语言考试试题1
- C语言面试题1
- C#_面试题1
- C/C++面试题1
- C/C++面试题-1
- obj-c面试题1
- c语言面试题1
- 嵌入式 C 面试题1
- C语言模拟试题1
- C/C++面试题-1
- c语言面试题1
- C语言面试题1
- C语言面试题1
- C-C++面试题1
- c语言面试题1
- Numpy使用3
- UISegment
- Android bootanimation 制作过程
- 基于BoF的图像分类完整步骤(以ScSPM为例)
- Android开发技巧——定制仿微信图片裁剪控件
- c++试题(1)
- 最短路径问题
- 实现button的监听,3种方式
- poj 3061 Subsequence
- Hibernate学习篇07——manytoone简单实例
- 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)
- Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
- 【ZOJ2676】Network Wars 最小割+01分数规划
- php读取网络文件 curl, fsockopen ,file_get_contents 几个方法的效率对比