生活随笔
收集整理的這篇文章主要介紹了
单链表逆向
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)自:http://blog.csdn.net/heyabo/article/details/7610732
對于單鏈表的逆置有兩種方法可以實現(xiàn):
(1)利用輔助指針
? ? ? ? ?基本思想:在遍歷結(jié)點過程中,設(shè)置輔助指針,用于記錄先前遍歷的結(jié)點。這樣依次編譯的過程中只需修改其后繼結(jié)點的next域即可。
? ? ? ? ?實現(xiàn)代碼:
[cpp]?view plaincopy print?
typedef?int?DataType;??? typedef?struct?node{???? ??????DataType?data;?? ??????struct?node*?next;?? }LinkedNode,*LinkList;?? void?ReverseList(LinkList&?ListHead)?? {?? ????cout<<"Begin?to?Reverse?the?List"<<endl;?? ????if(?(NULL==ListHead)||(NULL==ListHead->next)?)return?;???? ????LinkedNode*?pPre=ListHead;?????? ????LinkedNode*?pCur=pPre->next;???? ????LinkedNode*?pNext=NULL;????????? ????while(pCur!=NULL)?? ????{?? ????????pNext=pCur->next;?? ????????pCur->next=pPre;?? ????????pPre=pCur;?? ????????pCur=pNext;?? ????}?? ????ListHead->next=NULL;?? ????ListHead=pPre;?????????? }??
? ? ? ??
? ? ? ??
? ? ? ? ? ?示意圖:
(2)遞歸
? ? ? ? ?基本思想:在對當(dāng)前結(jié)點逆置時,先遞歸地逆置其后繼結(jié)點,然后將后繼結(jié)點指向當(dāng)前結(jié)點。
? ? ? ? ?實現(xiàn)代碼:
寫了兩個版本
I、返回值為空
[cpp]?view plaincopy print?
void?ReverseList(LinkedNode*?pCur,LinkList&?ListHead)?? {?? ????if(?(NULL==pCur)||(NULL==pCur->next)?)?? ????{?? ????????ListHead=pCur;?? ????}?? ????else?? ????{?? ????????LinkedNode*?pNext=pCur->next;?? ????????ReverseList(pNext,ListHead);??? ????????pNext->next=pCur;?????????????? ????????pCur->next=NULL;?? ????}?? }??
II、返回值為結(jié)點類型
[cpp]?view plaincopy print?
LinkedNode*?ReverseList(LinkedNode*?pCur,LinkList&?ListHead)?? {?? ????cout<<"Begin?to?Reverse?the?List"<<endl;?? ????if(?(NULL==pCur)||(NULL==pCur->next)?)?? ????{?? ????????????ListHead=pCur;?? ????????????return?pCur;?? ????}?? ????else?? ????{?? ????????LinkedNode*?pTemp=ReverseList(pCur->next,ListHead);??? ????????pTemp->next=pCur;????? ????????pCur->next=NULL;?? ????????return?pCur;?? ????}?? }??
? ? ? ? ?示意圖:
? ? ? ??
下面給出完整的程序:
[cpp]?view plaincopy print?
#include<iostream>?? using?namespace?std;?? const?int?N=6;?? typedef?int?DataType;?? typedef?struct?node{??? ??????DataType?data;?? ??????struct?node*?next;?? }LinkedNode,*LinkList;?? ?? LinkList?CreateList(DataType?a[N])?? {?? ????LinkedNode*?ListHead=new?LinkedNode();?? ????ListHead->data=a[0];?? ????ListHead->next=NULL;?? ????for(int?i=N-1;i>=1;i--)?? ????{?? ????????LinkedNode*?p=new?LinkedNode();?? ????????p->data=a[i];?? ????????p->next=ListHead->next;?? ????????ListHead->next=p;?? ????}?? ????return?ListHead;?? }?? ?? void?PrintList(LinkList?ListHead)?? {?? ????if(NULL==ListHead)cout<<"The?List?is?empty!"<<endl;?? ????else?? ????{?? ????????LinkedNode*?p=ListHead;?? ????????while(p!=NULL)?? ????????{?? ????????????cout<<p->data<<"?";?? ????????????p=p->next;?? ????????}?? ????????cout<<endl;?? ????}?? }?? void?ReverseList(LinkedNode*?pCur,LinkList&?ListHead)?? {?? ????if(?(NULL==pCur)||(NULL==pCur->next)?)?? ????{?? ????????ListHead=pCur;?? ????}?? ????else?? ????{?? ????????LinkedNode*?pNext=pCur->next;?? ????????ReverseList(pNext,ListHead);??? ????????pNext->next=pCur;?????????????? ????????pCur->next=NULL;?? ????}?? }?? int?main()?? {?? ????int?a[N]={1,2,3,4,5,6};??? ????LinkedNode*?list=CreateList(a);?? ????PrintList(list);?? ????LinkedNode*pTemp=list;?? ????ReverseList(pTemp,list);?? ????PrintList(list);?? ????return?0;?? }??
總結(jié)
以上是生活随笔為你收集整理的单链表逆向的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。