在浏览的进程中有任何问题,欢迎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