zoukankan      html  css  js  c++  java
  • 单链表逆置

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

    (1)利用辅助指针

             基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。

             实现代码:

    [cpp] view plaincopyprint?

    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. 10.     LinkedNode* pPre=ListHead;    //先前指针   
    11. 11.     LinkedNode* pCur=pPre->next;  //当前指针   
    12. 12.     LinkedNode* pNext=NULL;       //后继指针   
    13. 13.     while(pCur!=NULL)  
    14. 14.     {  
    15. 15.         pNext=pCur->next;  
    16. 16.         pCur->next=pPre;  
    17. 17.         pPre=pCur;  
    18. 18.         pCur=pNext;  
    19. 19.     }  
    20. 20.     ListHead->next=NULL;  
    21. 21.     ListHead=pPre;        //记录下新的头结点   

    22. }  

    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)递归

             基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。

             实现代码:

    写了两个版本

    I、返回值为空

    [cpp] view plaincopyprint?

    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. 10.         ReverseList(pNext,ListHead); //递归逆置后继结点   
    11. 11.         pNext->next=pCur;            //将后继结点指向当前结点。   
    12. 12.         pCur->next=NULL;  
    13. 13.     }  

    14. }  

    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、返回值为结点类型

    [cpp] view plaincopyprint?

    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. 10.     {  
    11. 11.         LinkedNode* pTemp=ReverseList(pCur->next,ListHead); //递归逆置后继结点   
    12. 12.         pTemp->next=pCur;   //将后继结点指向当前结点   
    13. 13.         pCur->next=NULL;  
    14. 14.         return pCur;  
    15. 15.     }  

    16. }  

    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 plaincopyprint?

    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. {  

    1. 12.     LinkedNode* ListHead=new LinkedNode();  
    2. 13.     ListHead->data=a[0];  
    3. 14.     ListHead->next=NULL;  
    4. 15.     for(int i=N-1;i>=1;i--)  
    5. 16.     {  
    6. 17.         LinkedNode* p=new LinkedNode();  
    7. 18.         p->data=a[i];  
    8. 19.         p->next=ListHead->next;  
    9. 20.         ListHead->next=p;  
    10. 21.     }  
    11. 22.     return ListHead;  

    23. }  

    24. /****输出单链表****/  

    25. void PrintList(LinkList ListHead)  

    26. {  

    1. 27.     if(NULL==ListHead)cout<<"The List is empty!"<<endl;  
    2. 28.     else  
    3. 29.     {  
    4. 30.         LinkedNode* p=ListHead;  
    5. 31.         while(p!=NULL)  
    6. 32.         {  
    7. 33.             cout<<p->data<<" ";  
    8. 34.             p=p->next;  
    9. 35.         }  
    10. 36.         cout<<endl;  
    11. 37.     }  

    38. }  

    39. void ReverseList(LinkedNode* pCur,LinkList& ListHead)  

    40. {  

    1. 41.     if( (NULL==pCur)||(NULL==pCur->next) )  
    2. 42.     {  
    3. 43.         ListHead=pCur;  
    4. 44.     }  
    5. 45.     else  
    6. 46.     {  
    7. 47.         LinkedNode* pNext=pCur->next;  
    8. 48.         ReverseList(pNext,ListHead); //递归逆置后继结点   
    9. 49.         pNext->next=pCur;            //将后继结点指向当前结点。   
    10. 50.         pCur->next=NULL;  
    11. 51.     }  

    52. }  

    53. int main()  

    54. {  

    1. 55.     int a[N]={1,2,3,4,5,6};   
    2. 56.     LinkedNode* list=CreateList(a);  
    3. 57.     PrintList(list);  
    4. 58.     LinkedNode*pTemp=list;  
    5. 59.     ReverseList(pTemp,list);  
    6. 60.     PrintList(list);  
    7. 61.     return 0;  

    62. }  

  • 相关阅读:
    环形数组求最大子数组
    教学楼电梯调度需求分析
    结对编程实践扩展
    《梦断代码》读书笔记
    CS小分队第二阶段冲刺站立会议(5月30日)
    CS小分队第二阶段冲刺站立会议(5月29日)
    CS小分队第二阶段冲刺站立会议(5月28日)
    第一阶段冲刺个人总结
    CS小分队第二阶段冲刺站立会议(5月27日)
    CS小分队第二阶段冲刺站立会议(5月26日)
  • 原文地址:https://www.cnblogs.com/fickleness/p/3159190.html
Copyright © 2011-2022 走看看