通過迭代(非遞迴)及遞迴將單鏈表逆序
老生常談的問題了,不過很多地方面試還是很喜歡問這個問題。實際工程中感覺用處不大,需要逆序的儲存為什麼要選擇單鏈表呢?為什麼不用list(in c++)或iterator(in any language)?或者將資料全部推入棧中再依次彈出。說了這麼多有點無聊了,參看酷殼的《我為什麼反對純演算法面試》。
迭代(非遞迴)演算法描述:
設定兩個臨時指標prev和next分別標記當前結點的前驅和後繼,將當前結點的next指標指向前驅,然後把前驅指標替換為當前結點,當前結點替換為next,即向「後」移動,直到鍊錶空了(next為null)。
c/c++實現:
1 typedef struct _node
2 list;
67 list* reverse(list* head)
8 22 head->next = null;
23 head = pre;
2425
return head;
26 }
遞迴演算法描述:要將當前結點逆序,那麼先將它的後繼結點都逆序,然後把逆序後的尾結點的next指向當前結點即可。
c/c++實現:
1 list* recurreverse(list* p, list* head)2 8
else
9
14 }
完。icc develop center
單鏈表的逆置(遞迴和非遞迴)
include include typedef char linktype typedef struct linklistlinklist void linklistinit linklist head head null void linklistprint linklist head linkl...
單鏈表反轉(遞迴和非遞迴)
單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 cpp view plain copy typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟...
單鏈表反轉(遞迴和非遞迴)
單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟2 其中注意,鍊錶是以節點後繼為null...