单链表反转(递归和非递归)
来源:互联网 发布:学电脑编程能干什么 编辑:程序博客网 时间:2024/06/04 17:49
单链表反转有递归和非递归两种算法。
下面定义节点
- typedef struct ListNode{
- int value;
- ListNode* next;
- }ListNode;
在递归算法中的做法是:
1找到最后一个节点和倒数第二个节点,把最后一个节点设为头节点的后继
2反转这两个节点
3倒数第三个和第四个节点重复执行步骤2
其中注意,链表是以节点后继为NULL结束的,在更改指针的过程中要把改后的节点后继改为NULL
代码如下:
- void Inversion_Recursion(ListNode* p,ListNode* Head)
- {
- if(p->next==NULL)
- {
- Head->next=p;
- return;//找到最后一个节点
- }
- Inversion_Recursion(p->next,Head);
- p->next->next=p;//反转节点
- p->next=NULL;//第一个节点反转后其后继应该为NULL
- }
非递归实现很简单,只需要遍历一遍链表,在遍历过程中,把遍历的节点一次插入到头部。在这个过程之后,第一个节点成了最后节点,因此要特殊处理,改其后继为NULL
- void Inversion(ListNode* Head)
- {
- ListNode *current,*tmp;
- current=Head->next;
- if(current!=NULL)//反转后第一个节点的后继要为NULL
- {
- tmp=current;
- current=current->next;
- tmp->next=NULL;
- }
- while(current!=NULL)
- {
- tmp=current;
- current=current->next;
- tmp->next=Head->next;
- Head->next=tmp;
- }
- }
测试代码:
- #include<iostream>
- #include<malloc.h>
- typedef struct ListNode{
- int value;
- ListNode* next;
- }ListNode;
- int main()
- {
- ListNode* Head=(ListNode*)malloc(sizeof(ListNode));
- if(Head==NULL)
- std::cout<<"malloc failed"<<std::endl;
- ListNode* tmp=Head;
- for(int i=1;i<=10;i++)
- {
- tmp->next=(ListNode*)malloc(sizeof(ListNode));
- tmp->next->value=i;
- tmp->next->next=NULL;
- tmp=tmp->next;
- }
- Inversion_Recursion(Head->next,Head);
- Inversion(Head);
- tmp=Head->next;
- while(1){
- std::cout<<tmp->value<<std::endl;
- if(tmp->next==NULL)
- break;
- tmp=tmp->next;
- }
- }
0 0
- 单链表反转(递归和非递归)
- 单链表反转(递归和非递归)
- 单链表反转(递归和非递归)
- 单链表反转(递归和非递归)
- 单链表递归反转和非递归翻转
- 单链表反转(非递归)
- 【面试题】单链表反转-递归和非递归
- 使用单链表反转的递归和非递归实现方式
- 边看边写(链表反转(递归和非递归))
- 反转二叉树--递归和非递归
- 单链表的反转(非递归)
- 单链表反转(非递归java实现)
- 链表的建立与反转(递归反转和非递归反转)
- 单链表的反转(非递归与递归版本)
- 单链表的反转(递归与非递归方式)
- 反转单链表 递归与非递归
- 单链表反转:递归与非递归实现
- 使用递归和非递归方式反转单向链表
- Android Xutils 框架
- Android 关于 EditText 的一些问题 如:不弹出输入法
- aircrack-ng学习心得(一)
- ios协议和委托
- tinyxml2源码分析(一)
- 单链表反转(递归和非递归)
- Makefile实例
- 求(1~n)中有多少个数字包含49数字
- 生活的调味剂之生活百味
- 重拾Android 之 界面事件
- 微信Android终端SDK新手使用指南 libammsdk.jar
- 策略路由基础命令(Linux)分享
- HoloGraphLibrary 源码解析
- Linux 学习day01-day02