將一個單鏈表反向。即:讓原來的前一結點成爲後一結點,原來的頭結點成爲尾結點,原來的尾結點成爲頭結點。
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;
}