在瀏覽的進程中有任何問題,歡迎1起交換
郵箱:1494713801@qq.com
QQ:1494713801
問題:
給1個單向鏈表,把它從頭到尾反轉過來。比如: a -> b -> c ->d 反過來就是 d -> c -> b -> a 。
分析:
假定每個node的結構是:
class Node { char value; Node next;}
非遞歸方式代碼以下:
1. void reverse(struct Node **list)
2. {
3. struct Node *currentp = *list;
4. struct Node *pleft = NULL;
5. struct Node *pright = NULL;
6.
7.
8. while (currentp != NULL) {
9. pright = currentp->next;
10. currentp->next = pleft;
11. pleft = currentp;
12. currentp = pright;
13. }
14. *list = pleft;
15. }
遞歸的方式代碼以下:
1. struct Node* recursive_reverse(struct Node *list)
2. {
3. struct Node *head = list;
4. struct Node *p = r_reverse(list);
5. head->next = NULL;
6. return p;
7. }
8.
9. struct Node *r_reverse(struct Node *list)
10. {
11. if (NULL == list || NULL == list->next)
12. return list;
13. struct Node *p = r_reverse(list->next);
14. list->next->next = list;
15. return p;
16. }
遞歸的方法實際上是非常巧的,它利用遞歸走到鏈表的末端,然后再更新每個node的next 值 (代碼倒數第2句)。 在上面的代碼中, reverseRest 的值沒有改變,為該鏈表的最后1個node,所以,反轉后,我們可以得到新鏈表的head。
單鏈表相鄰元素轉置(非遞歸)
1. struct Node* recursive_reverse(struct Node *list)
2. {
3. struct Node *head = list;
4. struct Node *p = r_reverse(list);
5. head->next = NULL;
6. return p;
7. }
8.
9. struct Node *r_reverse(struct Node *list)
10. {
11. if (NULL == list || NULL == list->next)
12. return list;
13. struct Node *p = r_reverse(list->next);
14. list->next->next = list;
15. return p;
16. }
4 單鏈表相鄰元素轉置(遞歸)
1. struct Node * recursive_partial_reverse(struct Node *list)
2. {
3. if (NULL == list || NULL == list->next)
4. return list;
5. struct Node *p = list->next;
6. struct Node *node = recursive_partial_reverse(list->next->next);
7. list->next->next = list;
8. list->next = node;
9. return p;
10. }
參考鏈接:
http://blog.csdn.net/skylinesky/article/details/760694