关闭

C 单向链表反转

标签: c链表反转单链表
293人阅读 评论(0) 收藏 举报
分类:

示意图

代码实现

  1. #include<stdio.h>  
  2.    
  3. struct ListNode{  
  4.     int data;  
  5.     ListNode *next;  
  6. }   
  7.   
  8. ListNode* reverse(ListNode* head){  
  9.     ListNode *p,*tmp ;  
  10.     p = head->next;  
  11.     head->next=NULL;  
  12.     while(p){  
  13.         tmp = p->next; //图1 保存p->next  
  14.         p->next = head; //图1 反向指向head   
  15.         head = p ; //图2 head 指向p    
  16.         p = tmp; //图2 p指向p->next   
  17.     }  
  18.     return head;   
  19. }  
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. struct node  
  5. {  
  6.     int val;  
  7.     struct node *pNext;  
  8. };  
  9.   
  10.   
  11. struct node *gen()  
  12. {  
  13.     struct node *pHead = NULL;  
  14.   
  15.     for(int i = 10; i > 0; i--){  
  16.         struct node * p = (struct node *)malloc(sizeof(struct node));  
  17.         p -> val = i;  
  18.         p -> pNext = pHead;  
  19.         pHead = p;  
  20.     }     
  21.     return pHead;  
  22. }  
  23.   
  24. void display(struct node *pHead)  
  25. {  
  26.     while( pHead != NULL)  
  27.     {     
  28.         printf("%d ", pHead->val);  
  29.         pHead = pHead->pNext;  
  30.     }     
  31.     printf("\n");  
  32. }  
  33.   
  34. //递归实现  
  35. struct node * reverse(struct node *pHead)  
  36. {  
  37.     if (pHead == NULL || pHead -> pNext == NULL)  
  38.     {     
  39.         return pHead;  
  40.     }     
  41.     struct node *p = pHead -> pNext;  
  42.     struct node *pNewHead =  reverse(p);  
  43.     p -> pNext = pHead;  
  44.     pHead ->pNext = NULL;  
  45.     return pNewHead;  
  46. }  
  47.   
  48. //尾递归实现  
  49. struct node * do_reverse_tail(struct node *pHead, struct node *pNewHead)  
  50. {  
  51.     if(pHead == NULL)  
  52.     {  
  53.         return pNewHead;  
  54.     }  
  55.     else  
  56.     {  
  57.         struct node *pNext = pHead->pNext;  
  58.         pHead->pNext = pNewHead;  
  59.         return do_reverse_tail(pNext, pHead);  
  60.     }  
  61. }  
  62.   
  63. struct node * reverse_tail(struct node *pHead)  
  64. {  
  65.     return do_reverse_tail(pHead, NULL);  
  66. }  
  67.   
  68. //迭代实现  
  69. struct node * reverse_it(struct node *pHead)  
  70. {  
  71.     struct node *pNewHead = NULL;  
  72.     struct node *pPrev = NULL;  
  73.     struct node *pCur = pHead;  
  74.     while(pCur != NULL)  
  75.     {  
  76.         struct node *pTmp = pCur->pNext;  
  77.         if(pTmp == NULL)  
  78.         {  
  79.             pNewHead = pCur;  
  80.         }  
  81.         pCur->pNext = pPrev;  
  82.         pPrev = pCur;  
  83.         pCur = pTmp;  
  84.     }  
  85.   
  86.     return pNewHead;  
  87. }  
  88.   
  89. int main()  
  90. {  
  91.     struct node *pHead = gen();  
  92.     display(pHead);  
  93.     pHead = reverse_it(pHead);  
  94.     display(pHead);  
  95. }  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:268748次
    • 积分:2706
    • 等级:
    • 排名:第13298名
    • 原创:53篇
    • 转载:85篇
    • 译文:0篇
    • 评论:32条
    最新评论