将一个单链表反向。即:让原来的前一结点成为后一结点,原来的头结点成为尾结点,原来的尾结点成为头结点。
listnode.h
struct Listnode
{
int mvalue;
Listnode *pnext;
};
creatlist.cpp
#include <iostream>
#include "listnode.h"
using namespace std;
ListNode* creatlist()
{
ListNode *pHead=new ListNode();
ListNode *p1=pHead;
int mval=0;
while((mval+1)!=0)
{
cin>>mval;
ListNode *pnode=new ListNode();
pnode->mvalue=mval;
pnode->pnext=NULL;
p1->pnext=pnode;
p1=pnode;
}
pHead=pHead->pnext;
return pHead;
}
#include <iostream>
#include "creatlist.cpp"
using namespace std;
ListNode* reverselist(ListNode* pHead);
int main()
{
ListNode *pHead=creatlist();
ListNode *p1=pHead;
while(p1!=NULL)
{
cout<<p1->mvalue <<" " ;
p1=p1->pnext;
}
cout <<endl;
ListNode *pNewHead=reverselist(pHead);
ListNode *p2=pNewHead;
while(p2!=NULL)
{
cout<<p2->mvalue <<" " ;
p2=p2->pnext;
}
cout <<endl;
return 0;
}
//反转链表时,要将当前结点的pnext指针指向其前一个结点,因此需要找到当前结点和其前一结点;
//同时,改变了链表结点的指针指向之后,为了防止链表断裂,需要事先保存当前结点的后一结点。
//因此,为了反转链表,至少需要三个指针,分别指向当前结点和其前后结点
//另外要注意:一定要把原链表的尾结点赋为新链表的头结点
ListNode* reverselist(ListNode* pHead)
{
ListNode *pnewHead=NULL;
ListNode *pre=NULL;
ListNode *cur=pHead;
while(cur!=NULL)
{
ListNode *pnext=cur->pnext;//反转之前,事先保存当前结点的后一结点
//如果当前结点为尾结点,则其就是新链表的头结点
if (pnext==NULL)
{
pnewHead=cur;
}
cur->pnext=pre;//反转指针指向
//反转之后,将当前结点指针后移
pre=cur;
cur=pnext;
}
return pnewHead;
}