首页 > 代码库 > (转)单链表的逆置
(转)单链表的逆置
对于单链表的逆置有两种方法可以实现:
(1)利用辅助指针
基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。
实现代码:
1 typedef int DataType; //类型定义 2 typedef struct node{ //单链表定义 3 DataType data; 4 struct node* next; 5 }LinkedNode,*LinkList; 6 void ReverseList(LinkList& ListHead) 7 { 8 cout<<"Begin to Reverse the List"<<endl; 9 if( (NULL==ListHead)||(NULL==ListHead->next) )return ; //边界检测10 LinkedNode* pPre=ListHead; //先前指针11 LinkedNode* pCur=pPre->next; //当前指针12 LinkedNode* pNext=NULL; //后继指针13 while(pCur!=NULL)14 {15 pNext=pCur->next;16 pCur->next=pPre;17 pPre=pCur;18 pCur=pNext;19 }20 ListHead->next=NULL;21 ListHead=pPre; //记录下新的头结点22 }
示意图:
(2)递归
基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。
实现代码
写了两个版本
I 返回值为空
1 void ReverseList(LinkedNode* pCur,LinkList& ListHead) 2 { 3 if( (NULL==pCur)||(NULL==pCur->next) ) 4 { 5 ListHead=pCur; 6 } 7 else 8 { 9 LinkedNode* pNext=pCur->next;10 ReverseList(pNext,ListHead); //递归逆置后继结点11 pNext->next=pCur; //将后继结点指向当前结点。12 pCur->next=NULL;13 }14 }
II、返回值为结点类型
1 LinkedNode* ReverseList(LinkedNode* pCur,LinkList& ListHead) 2 { 3 cout<<"Begin to Reverse the List"<<endl; 4 if( (NULL==pCur)||(NULL==pCur->next) ) 5 { 6 ListHead=pCur; 7 return pCur; 8 } 9 else10 {11 LinkedNode* pTemp=ReverseList(pCur->next,ListHead); //递归逆置后继结点12 pTemp->next=pCur; //将后继结点指向当前结点13 pCur->next=NULL;14 return pCur;15 }16 }
示意图:
下面给出完整的程序:
1 #include<iostream> 2 using namespace std; 3 const int N=6; 4 typedef int DataType;//类型定义 5 typedef struct node{ //单链表 6 DataType data; 7 struct node* next; 8 }LinkedNode,*LinkList; 9 /****由数组创建单链表****/10 LinkList CreateList(DataType a[N])11 {12 LinkedNode* ListHead=new LinkedNode();13 ListHead->data=http://www.mamicode.com/a[0];14 ListHead->next=NULL;15 for(int i=N-1;i>=1;i--)16 {17 LinkedNode* p=new LinkedNode();18 p->data=http://www.mamicode.com/a[i];19 p->next=ListHead->next;20 ListHead->next=p;21 }22 return ListHead;23 }24 /****输出单链表****/25 void PrintList(LinkList ListHead)26 {27 if(NULL==ListHead)cout<<"The List is empty!"<<endl;28 else29 {30 LinkedNode* p=ListHead;31 while(p!=NULL)32 {33 cout<<p->data<<" ";34 p=p->next;35 }36 cout<<endl;37 }38 }39 void ReverseList(LinkedNode* pCur,LinkList& ListHead)40 {41 if( (NULL==pCur)||(NULL==pCur->next) )42 {43 ListHead=pCur;44 }45 else46 {47 LinkedNode* pNext=pCur->next;48 ReverseList(pNext,ListHead); //递归逆置后继结点49 pNext->next=pCur; //将后继结点指向当前结点。50 pCur->next=NULL;51 }52 }53 int main()54 {55 int a[N]={1,2,3,4,5,6}; 56 LinkedNode* list=CreateList(a);57 PrintList(list);58 LinkedNode*pTemp=list;59 ReverseList(pTemp,list);60 PrintList(list);61 return 0;62 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。