加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

【算法题】使用递归和非递归实现单向链表的转置

发布时间:2020-12-13 20:09:43 所属栏目:PHP教程 来源:网络整理
导读:在浏览的进程中有任何问题,欢迎1起交换 邮箱: 1494713801@qq.com QQ : 1494713801 问题: 给1个单向链表,把它从头到尾反转过来。比如: a-b-c-d 反过来就是 d-c-b-a 。 分析: 假定每个 node 的结构是: classNode{ charvalue; Nodenext;} 非递归方式代

在浏览的进程中有任何问题,欢迎1起交换

邮箱:1494713801@qq.com   

QQ1494713801

 

问题:

给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

 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读