单链表的反向

来源:互联网 发布:阿里云怎么做端口映射 编辑:程序博客网 时间:2024/06/11 17:17

昨天看CSDN的一个文章提到,某公司面试时问到单向链表的反转问题,有好多程序员答不出来。以前我也没做过类似的题目,试着写了一下。

问题描述:已知一个单向链表,写一个函数,使得该链表的方向反转,即头变尾,尾变头,指示方向相反。

分析:该问题可以有两种方法,一是交换首尾两个节点的数据,而不改变其内存的存储结构,二是改变所有节点的指向下一个节点的指针。显然第二种方法更加有效。

 

 

[cpp] view plaincopy
  1. /×链表的定义和一些操作*/  
  2. typedef struct list  
  3. {  
  4.     int no;  
  5.     struct list *pNext;  
  6. }list;  
  7. list *listinit(int count)  
  8. {  
  9.     list *pHead;  
  10.     list *pList;  
  11.     int no=0;  
  12.     pHead=malloc(sizeof(list));  
  13.     pHead->no=no;  
  14.     pList=pHead;  
  15.     while(count--)  
  16.     {  
  17.         pList->pNext=malloc(sizeof(list));  
  18.         pList=pList->pNext;  
  19.         pList->no=++no;  
  20.   
  21.     }  
  22.     pList->pNext=NULL;  
  23.     return pHead;  
  24. }  
  25. void listrelease(list *pHead)  
  26. {  
  27.     list *pList=pHead;  
  28.     list *pNext;  
  29.     //free((char*)pHead);  
  30.     //return;  
  31.     while(pList!=NULL)  
  32.     {  
  33.         pNext=pList->pNext;  
  34.         free(pList);  
  35.         pList=pNext;  
  36.     }  
  37.   
  38. }  

 

 

 

[c-sharp] view plaincopy
  1. /*链表反转的算法,其实很简单*/  
  2. list *listreverse(list *pHead)  
  3. {  
  4.     list *pList=pHead;  
  5.     list *paPre=NULL;  
  6.     list *paNext=NULL;  
  7.     do  
  8.     {  
  9.         paNext=pList->pNext;  
  10.         pList->pNext=paPre;  
  11.         paPre=pList;  
  12.         pList=paNext;  
  13.     }while(pList!=NULL);  
  14.     return paPre;  
  15. }  
  16. /*这是测试用的函数*/  
  17. void listshow(list *pHead)  
  18. {  
  19.     list *pList=pHead;  
  20.     while(pList!=NULL)  
  21.     {  
  22.         printf("list=%d/n",pList->no);  
  23.         pList=pList->pNext;  
  24.     }  
  25. }  
  26. int main()  
  27. {  
  28.     list *pHead=listinit(10);  
  29.     printf("before reverse:/n");  
  30.     listshow(pHead);  
  31.   
  32.     pHead=listreverse(pHead);  
  33.     printf("after reverse:/n");  
  34.     listshow(pHead);  
  35.   
  36.     listrelease(pHead);  
  37.     return 0;  
  38. }  

 

 

运行结果:

before reverse:                                                              

list=0                                                                         

list=1                                                                         

list=2                                                                         

list=3                                                                         

list=4                                                                         

list=5                                                                         

list=6                                                                         

list=7                                                                         

list=8                                                                         

list=9                                                                         

list=10                                                                        

after reverse:                                                                 

list=10                                                                        

list=9                                                                         

list=8                                                                         

list=7                                                                         

list=6                                                                         

list=5                                                                         

list=4                                                                         

list=3                                                                         

list=2                                                                         

list=1                                                                         

list=0                                                                                                                      

 

 

0 0
原创粉丝点击