通過迭代(非遞歸)及遞歸將單鏈表逆序
老生常談的問題了,不過很多地方面試還是很喜歡問這個問題。實際工程中感覺用處不大,需要逆序的存儲為什么要選擇單鏈表呢?為什么不用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 }
完。