您的位置:首页 > 编程语言 > C语言/C++

c++试题(1)

2016-03-08 16:58 543 查看
递归的本质就是栈!!!

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

非递归:

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: