【算法题】使用递归和非递归实现单向链表的转置
来源:互联网 发布:php移动文件函数 编辑:程序博客网 时间:2024/06/03 22:54
在阅读的过程中有任何问题,欢迎一起交流
邮箱:1494713801@qq.com
QQ:1494713801
问题:
给一个单向链表,把它从头到尾反转过来。比如: 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 值 (代码倒数第二句)。 在上面的代码中, reverseRest 的值没有改变,为该链表的最后一个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
- 【算法题】使用递归和非递归实现单向链表的转置
- 使用递归和非递归方式反转单向链表
- 使用递归和非递归方式反转单向链表
- 使用递归和非递归方式反转单向链表
- 使用递归和非递归方式反转单向链表
- 有序链表合并的递归和非递归算法
- 链表翻转的递归和非递归算法
- 有序链表合并的递归和非递归算法
- 链表反转的递归和非递归算法
- 分别使用递归和非递归实现二分查找算法
- 递归和非递归实现单链表的转置。
- 链表反转的递归和非递归实现方式
- 链表反转的递归和非递归实现方式
- 链表翻转的递归和非递归实现
- 单链表的逆序实现,递归和非递归算法
- 欧几里得算法求最大公约数的递归和非递归实现
- 归并算法的递归和非递归实现
- 使用单链表反转的递归和非递归实现方式
- 用Python和Pygame写游戏-从入门到精通(17)
- Yii2 使用十一 在设置enablePrettyUrl时候,defaultAction的设置方法
- /*输入1 个正整数 n(n<=100),计算并输出1+1/2+1/3+……+1/n。*/
- startssl证书申请
- 2858:骨牌铺方格
- 【算法题】使用递归和非递归实现单向链表的转置
- linux重启和关闭系统命令
- 判断单链表是否有环
- VB操作Excel
- springMVC快速入门(转)
- CSS实战手册的一些笔记(1)
- ruby 實變數
- /*c++中二维数组的输入正常,但是输出有问题,感觉就是输入进去但是没有保存下 */
- poj3061---Subsequence