0
点赞
收藏
分享

微信扫一扫

反转一个链表。循环算法


//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;
}



举报

相关推荐

0 条评论