//1、反转一个链表。循环算法。
#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* reverse(List* l)
{
if(!l) return l;
List* cur = l->pnext;
List* pre = l;
List* tmp;
pre->pnext = NULL;
while ( cur ) {
tmp = cur;
cur = cur->pnext;
tmp->pnext = pre;
pre = tmp;
}
return tmp;
}
List* MyRev(List* l)
{
if (!l)return l;
List* MyPrev=l;
List* I=l->pnext;
List* OldI,*NewI;
MyPrev->pnext=NULL;
while(I)
{
OldI=I;
NewI=I->pnext;
OldI->pnext=MyPrev;
//更新
MyPrev=OldI;
I=NewI;
}
return OldI;
}
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=reverse(PlistA);
printf("printAll(PlistB)\n");
printAll(PlistB);
//
List* PlistC=MyRev(PlistB);
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;
}