List Reverse( List L )
{
PtrToNode p1=p2=p3=NULL;
p1=p2=p3=L;
p2=p1->Next;
p3=p2->Next;
p1->Next=NULL;
while(p2!=NULL)
{
p2->Next=p1;
p1=p2;
p2=p3;
if(p3!=NULL)
p3=p3->Next;
}
L->Next=p1;
return L;
}
SListNode* ReverseSeqList(SListNode *Seq) //逆置/反转单链表
{
SListNode *prev=Seq; //保存头节点
SListNode *cur=prev->_next; //保存第二个节点
SListNode *tmp;
assert(Seq);
prev->_next=NULL; //置空头节点的next,变成尾节点
while (cur!=NULL) //循环逆置
{
tmp=cur->_next;
cur->_next=prev;
prev=cur;
cur=tmp;
}
Seq=prev; //逆置后的头
return Seq;
}
对照下我写过的代码。原文链接:http://blog.csdn.net/qq_38646470/article/details/78976421
List Reverse( List L )
{
PtrToNode p1,p2,p3;
if(L==NULL||L->Next==NULL) //1
return L; //1
p1=p2=p3=L;
p2=p1->Next;//这里如果p1为NULL的话,会出现错误。
p3=p2->Next;//这里如果p2为NULL会出现错误。为了解决这两个错误加入1号两行代码,排除链表为空和只有一个结点的情况
p1->Next=NULL;
while(p2)
{
p2->Next=p1;
p1=p2;
p2=p3;
if(p3!=NULL)
p3=p3->Next;
}
//L->Next=p1; //整个链表逆转的话就算有头结点也要把头结点放到最后,修改为2号代码
L->Next = NULL;//2
L=p1; //2
return L;
}
更改有1、2两处。
List Reverse( List L )
{
PtrToNode p1,p2,p3;
if(L==NULL||L->Next==NULL) //1
return L; //1
p1=p2=p3=L;
p2=p1->Next;//这里如果p1为NULL的话,会出现错误。
p3=p2->Next;//这里如果p2为NULL会出现错误。为了解决这两个错误加入1号两行代码,排除链表为空和只有一个结点的情况
p1->Next=NULL;
while(p2)
{
p2->Next=p1;
p1=p2;
p2=p3;
if(p3!=NULL)
p3=p3->Next;
}
List Reverse( List L )
{
PtrToNode p1,p2,p3;
if(L==NULL||L->Next==NULL) //1
return L; //1
p1=p2=p3=L;
p2=p1->Next;//这里如果p1为NULL的话,会出现错误。
p3=p2->Next;//这里如果p2为NULL会出现错误。为了解决这两个错误加入1号两行代码,排除链表为空和只有一个结点的情况
p1->Next=NULL;
while(p2)
{
//。。。。。。。。。。。。。。。。
}