反轉單鏈表

將一個單鏈表反向。即:讓原來的前一結點成爲後一結點,原來的頭結點成爲尾結點,原來的尾結點成爲頭結點。

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章