//2、反转一个链表。递归算法。
#include <stdio.h>
#include <string.h>
struct List
{
List(char * name)
{
strcpy(this->name,name);
pnext=NULL;
}
List* InsertSbAfterMe(List* Sb)
{
Sb->pnext=this->pnext;
this->pnext=Sb;
return Sb;
}
char name[256];
List* pnext;
};
List* printAll(List* Plist);
List* resverse(List* l);
List* Myreverse(List* I,bool isFirstTwo=false);
void main()
{
List* PlistA=new List("zhao");
List* tmpList=PlistA->InsertSbAfterMe(new List("qian"));
tmpList=tmpList->InsertSbAfterMe(new List("shun"));
tmpList=tmpList->InsertSbAfterMe(new List("Li"));
printf("printAll(PlistA)\n");
printAll(PlistA);
//
List* PlistB=resverse(PlistA);
printf("printAll(PlistB)\n");
printAll(PlistB);
//*
List* PlistC=Myreverse(PlistB,true);
printf("printAll(PlistC)\n");
printAll(PlistC);
//*/
}
List* printAll(List* Plist)
{
List* walker=Plist;
while(walker)
{
printf("%s ",walker->name);
walker=walker->pnext;
}
printf("\n");
return Plist;
}
List* resverse(List* l)
{
static int counter=0;
printf("%d\n",++counter);
if(!l || !l->pnext) return l;
List* n = resverse(l->pnext);
l->pnext->pnext = l;
l->pnext=NULL;
return n;
}
List* MyRev(List* I)
{
static int counter=0;
printf("%d\n",++counter);
if(!I || !I->pnext) return I;
List* OIdI=I;
List* NewI=I->pnext;
List* n = MyRev(NewI);
NewI->pnext = OIdI;
OIdI->pnext=NULL;
return n;
}
List* Myreverse(List* I,bool isFirstTwo)
{
if(!I || !I->pnext)return I;
List* OldI=I;
List* NewI=I->pnext;
//*
if(isFirstTwo)
{
OldI->pnext=NULL;
isFirstTwo=false;
}
//*/
List* theLast=Myreverse(NewI);
NewI->pnext=OldI;
//OldI->pnext=NULL;
return theLast;
}
反转一个链表。递归算法
最新推荐文章于 2024-09-18 20:33:32 发布