(转)单链表的逆置

 

对于单链表的逆置有两种方法可以实现:

(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     else
10     {
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=a[0];
14     ListHead->next=NULL;
15     for(int i=N-1;i>=1;i--)
16     {
17         LinkedNode* p=new LinkedNode();
18         p->data=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     else
29     {
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     else
46     {
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 }

 

posted on 2014-07-02 16:40  笑侃码农  阅读(420)  评论(0编辑  收藏  举报