通過迭代(非遞歸)及遞歸將單鏈表逆序


通過迭代(非遞歸)及遞歸將單鏈表逆序

老生常談的問題了,不過很多地方面試還是很喜歡問這個問題。實際工程中感覺用處不大,需要逆序的存儲為什么要選擇單鏈表呢?為什么不用list(in c++)或iterator(in any language)?或者將數據全部推入棧中再依次彈出。說了這么多有點無聊了,參看酷殼的《我為什么反對純算法面試》

迭代(非遞歸)算法描述:

設置兩個臨時指針prev和next分別標記當前結點的前驅和后繼,將當前結點的next指針指向前驅,然后把前驅指針替換為當前結點,當前結點替換為next,即向“后”移動,直到鏈表空了(next為NULL)。

C/C++實現:

 

 1 typedef struct _Node
 2 {
 3     struct _Node* next;
 4     int data;
 5 } List;
 6 
 7 List* reverse(List* head)
 8 {
 9     if(List == NULL)
10         return ;
11 
12     List* pre = head;
13     List* cur = head->next;
14     List* ne;
15     while(cur != NULL)
16     {
17          ne = cur->next;
18          cur->next = pre;
19          pre = cur;
20          cur = next;
21     }
22     head->next = NULL;
23     head = pre;
24 
25     return head;
26 }

 

遞歸算法描述:要將當前結點逆序,那么先將它的后繼結點都逆序,然后把逆序后的尾結點的next指向當前結點即可。

C/C++實現:

 

 1 List* recurReverse(List* p, List* head)
 2 {
 3     if(p == NULL || p->next == NULL)
 4     {
 5         head = p;
 6         return p;
 7     }
 8     else
 9     {
10         List* q = reverse(p->next, head);
11         q->next = p;
12         return p;
13     }
14 }

 

完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM