一步一步写算法(之链表逆转) (转)

 链表逆转是面试环境中经常遇到的一道题目,也是我们在实际开发中可能会遇到的开发需求。和线性逆转不一样,单向链表的节点需要一个一个进行处理。为了显示两者之间的区别,我们分别对线性内存和链表进行逆转:

    (1)普通连续内存数据的反转分析

  1. bool normal_revert(int array[],int length)    
  2. {    
  3.     int temp;    
  4.     int i = 0, j = length - 1;   
  5.     if (NULL == array || 0 == length)    
  6.     {    
  7.         return FALSE;    
  8.     }    
  9.     
  10.     while (i < j)    
  11.     {    
  12.         temp = array[i];  
  13.         array[i] = array[j];  
  14.         array[j] = temp;  
  15.         ++i, --j;  
  16.     }    
  17.     
  18.     return TRUE;    
  19. }  

    (2)链表数据的反转

  1. STATUS link_revert(NODE** pNode)  
  2. {  
  3.     NODE* pPrevNode;  
  4.     NODE* pNextNode;  
  5.     if(NULL == pNode || NULL == *pNode)  
  6.         return FALSE;  
  7.   
  8.     pNextNode = (*pNode)->next;  
  9.     (*pNode) ->next = NULL;  
  10.   
  11.     while(pNextNode){  
  12.         pPrevNode = pNextNode;  
  13.         pNextNode = pNextNode->next;  
  14.         pPrevNode->next = *pNode;  
  15.         *pNode = pPrevNode;  
  16.     }  
  17.   
  18.     return TRUE;  
  19. }  

和连续内存不同,链表节点的反转需要进行下面一些操作:

 

    1) 判断指针是否为空,判断指针的指针是否为空

    2) 将指针分成两个部分,一个是已经反转成功的链表,即pNode;另外一个是待反转的链表,即pPrevNode

    3) 对2)进行循环迭代处理,直到所有的节点都已经接受反转

 

    建议大家可以好好观察一下两者之间的区别。

转自:http://blog.csdn.net/feixiaoxing/article/details/6853660

posted on   仅此而已_  阅读(233)  评论(0编辑  收藏  举报

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示