链表反转(递归与非递归实现)
复习一下链表反转
分别用递归的方法和非递归的方法实现。
链表反转中通过借助辅助參数,能够用两个指针完毕反转 Node* Reverse2Point(List* head)
#include <stdio.h>
#include <malloc.h>typedef int ElemType;
typedef struct Node {int data;struct Node* next;
}Node, *List;
//用数组arr来初始化链表中数据;此例中链表无头点
int InitList(List *list, ElemType* arr, int num)
{int i= 0;Node* tail_node; Node* tmp_node;*list =(List)malloc(sizeof(Node));if(NULL == *list)return;(*list)->data = arr[i];(*list)->next = NULL;tail_node = *list;for(i = 1; i < num; i++) {tmp_node = (Node*)malloc(sizeof(Node));if(NULL == tmp_node)return;tmp_node->data = arr[i];tmp_node->next = NULL;tail_node->next = tmp_node;tail_node = tmp_node; }
} void TraveseList(List list)
{Node* tmp_node;if(NULL == list)return;tmp_node = list;while(tmp_node) {printf("%d ", tmp_node->data);tmp_node = tmp_node->next;}printf("\n");
}void ReverseList(List* list)
{Node* p_pre = NULL;Node* p_cur = NULL;Node* p_nxt = NULL;if(NULL == list)return;p_cur = (*list)->next;p_pre = *list;p_pre->next = NULL;while(p_cur) {p_nxt = p_cur->next;p_cur->next = p_pre;p_pre = p_cur;p_cur = p_nxt;}*list = p_pre;
}Node* Reverse2Point(List* head)
{Node* p_cur = NULL;Node* p_nxt = NULL;if(NULL == *head)return;p_cur = (*head)->next;(*head)->next = NULL;while(p_cur) {p_nxt = p_cur->next;p_cur->next = *head;*head = p_cur;p_cur = p_nxt;}
}
//递归实现反转,返回反转后的链表头
//原理同上述非递归方法。反转当前节点和该节点的指针(反转前分别保存当前节点和该节点的下一个节点。以便完毕兴许节点同样的操作--通过递归完毕)
Node* Reverse(Node* p_cur, Node* p_pre)
{if(NULL == p_cur->next) {p_cur->next = p_pre;return p_cur;}else {Node *p_nxt = p_cur->next;p_cur->next = p_pre;Reverse(p_nxt, p_cur);}
}int main()
{List head;Node* tmp;int array[] = {3, 5, 7, 8, 2};InitList(&head, array, 5);TraveseList(head);printf("reverse list:");ReverseList(&head);TraveseList(head);printf("reverse list:");head = Reverse(head, NULL);TraveseList(head);printf("reverse list:");Reverse2Point(&head);TraveseList(head);return 0;
}
链表反转(递归与非递归实现)相关推荐
- 单链表反转(递归和非递归)
单链表反转有递归和非递归两种算法. 下面定义节点 [cpp] view plaincopy typedef struct ListNode{ int value; ListNode* next; }L ...
- 逆置单链表——递归与非递归
文章目录 前言 方式一:非递归 原理 图解 实现代码 方式二:递归 原理 图解 实现代码 完整实现 代码 运行结果 前言 单链表的逆置图解 方式一:非递归 原理 非递归逆置单链表的本质是创建一个新的链 ...
- java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法
题目描述 操作给定的二叉树,将其变翻转为源二叉树的镜像. 输入描述: 1 1 / \ / \ 2 3 ------> 3 2 / \ / \ / \ / \ 4 5 6 7 7 6 5 4 解题 ...
- 二叉树的遍历(递归,非递归,Morris)
二叉树的遍历 目录 递归遍历 非递归遍历 Morris遍历 1. 递归遍历 递归版遍历只要当前节点不为null,就可以三次回到当前节点. public static void preOrderRecu ...
- python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 全排列(含递归和非递归的解法)
全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...
- 全排列(递归与非递归实现)
全排列问题在公司笔试的时候非经常见,这里介绍其递归与非递归实现. 递归算法 1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a ...
- 【二叉树的遍历-3】后序遍历(递归与非递归)
[二叉树的遍历-1]前序遍历(递归与非递归) [二叉树的遍历-2]中序遍历(递归与非递归) [二叉树的遍历-4]层序遍历(递归与非递归) 后序遍历 后序遍历(LRD)是二叉树遍历的一种,也叫做后根遍历 ...
- 二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现
二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现 提示:今天开始,系列二叉树的重磅基础知识和大厂高频面试题就要出炉了,咱们慢慢捋清楚! 文章目录 二叉树,二叉树的归先序遍历,中序遍历, ...
- 二叉树的遍历(递归与非递归实现)
二叉树的遍历(递归与非递归实现) 二叉树的实现(三叉链表的形式) public class XieChaoThreeLinkBinTree<E> {public static class ...
最新文章
- 你想要的生信知识全在这——生信宝典目录 (181202)
- vue 给iframe设置src_vue项目iframe的传值问题
- python比较excel表格内容并提取_利用python提取多张excel表数据并汇总到同一张新表中...
- 南京理工大学计算机学院教师信息网,南京理工大学教师信息
- 转:关于Apache与Nginx的优势比较(经典)
- Homography拓展(含与平面法向量相关的情况)
- Mipmap与纹理过滤
- 美化 PowerShell
- 六西格玛dfss_实施六西格玛设计(DFSS)的主要工具有哪些?
- 精灵图在线测量,自动生成想要图片的宽高及位置
- Matlab中图像剪裁命令——imcrop()
- 哈工大SCIR十篇长文被EMNLP 2022主会及子刊录用
- dst发育筛查有意义吗_Dst发育筛查是什么?
- WebRTC回声抵消模块简要分析
- [创业] 美国互联网广告07年总开支255亿美元, 增长27%
- 使用java开发阿里云OSS开放云存储服务
- windows 7 共享文件夹
- Studio 3T 破解教程
- 6.824 raft lab 2A 2B实验分析
- 让DuiLib支持Icon图片显示