当前位置: 首页 > news >正文

链表反转算法

        链表的反转有较多的方法,如原地算法,迭代法、头插法、递归法,本文使用递归法和迭代法两种方式进行演示。

一、定义链表

typedef  struct   SinglyLinkNode
{/**后继节点 */struct  SinglyLinkNode* next;/** 节点数据域 */int  data;
} LinkNode;/**** 添加链表元素
*/
void  insert_link_node(LinkNode**  link,int data);/*** 查询链表
*/
void  show_link_list(LinkNode* head);/***递归法 链表反转
*/
LinkNode*  recursion_reversal(LinkNode*  head);/*** 迭代法 链表反转
*/
LinkNode*  iteration_reversal(LinkNode*  head);

二、链表操作

/**** 添加链表元素*/
void insert_link_node(LinkNode** link, int data)
{LinkNode* head=  *link;if (head == NULL){head = malloc(sizeof(LinkNode*));head->data = data;head->next = NULL;(*link) = head;return;}LinkNode* newNode = malloc(sizeof(LinkNode*));newNode->next = NULL;newNode->data = data;while (head!=NULL && head->next!=NULL ){head = head->next;}head->next = newNode;
}/*** 查询链表*/
void show_link_list(LinkNode *head)
{if (head == NULL){return;}printf("\n----\t");LinkNode *next = head;while (next != NULL){printf("%d\t", next->data);next = next->next;}printf("\n------------------------------------\n");
}

三、递归法

LinkNode* recursion_reversal(LinkNode* head)
{if ( head ==NULL || head->next == NULL){return head;}LinkNode* newNode = recursion_reversal(head->next);head->next->next = head;head->next = NULL;return newNode;
}
int main()
{int  arr[] = { 88, 77, 66, 55 , 44, 33 , 22 ,11};LinkNode* head = NULL;int i = 0;for( i ; i < sizeof(arr)/sizeof(int) ; i++ ){insert_link_node(&head,arr[i]);}show_link_list(head);head = recursion_reversal(head);show_link_list(head);while (1) {}exit(0);
}

四、迭代法

/*** 迭代法反转链表
*/
LinkNode*  iteration_reversal(LinkNode*  head)
{if(head==NULL ||  head->next==NULL){return head;}/// 存储当前节点LinkNode* cur = head;/// 存储临时存储前继节点LinkNode* pre = NULL;/// 临时存储当前后继节点LinkNode* next = NULL;while (cur->next!=NULL){next =  cur->next;cur->next = cur->next->next;if(pre == NULL){pre = next;pre->next = cur;head =  pre;}else{LinkNode* tmp =  head;next->next =  tmp;head =  next;}}return head;
}
int main()
{int  arr[] = { 88, 77, 66, 55 , 44, 33 , 22 ,11};LinkNode* head = NULL;int i = 0;for( i ; i < sizeof(arr)/sizeof(int) ; i++ ){insert_link_node(&head,arr[i]);}show_link_list(head);head = iteration_reversal(head);show_link_list(head);while (1) {}///getchar()exit(0);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 12.2 使用prometheus-sdk向pushgateway打点
  • Unity编辑器扩展:创建一个欢迎窗口,在启动Editor的时候显示自定义窗口。
  • 【信息学奥赛一本通】1008:计算(a+b)/c的值
  • easypoi模板导出word多页导出加强版
  • 5 分钟 Stable Diffusion 本地安装指南
  • Android14 蓝牙设备类型修改
  • 本地Docker部署Navidrome音乐服务器与远程访问听歌详细教程
  • 根据状态的不同,显示不同的背景颜色
  • 数据库学习
  • 动手实现基于Reactor模型的高并发Web服务器(一):epoll+多线程版本
  • 制作docker镜像
  • 打卡51天------图论(深搜/广搜应用题)
  • OpenCV图像滤波(Image Filtering)常用函数及其用法详解
  • CART决策树-基尼指数(全网最详解)
  • 克服编程学习中的挫折感:从心态到策略的全方位指南
  • 深入了解以太坊
  • python3.6+scrapy+mysql 爬虫实战
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 30天自制操作系统-2
  • CODING 缺陷管理功能正式开始公测
  • Git的一些常用操作
  • JAVA 学习IO流
  • JavaScript-Array类型
  • js正则,这点儿就够用了
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 搭建gitbook 和 访问权限认证
  • 排序算法之--选择排序
  • 前端攻城师
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 软件开发学习的5大技巧,你知道吗?
  • 三栏布局总结
  • 删除表内多余的重复数据
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 运行时添加log4j2的appender
  • nb
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (pytorch进阶之路)扩散概率模型
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (四)js前端开发中设计模式之工厂方法模式
  • (算法)求1到1亿间的质数或素数
  • (一)插入排序
  • (转)scrum常见工具列表
  • (转)树状数组
  • (转载)(官方)UE4--图像编程----着色器开发
  • (自用)gtest单元测试
  • .“空心村”成因分析及解决对策122344
  • .net dataexcel 脚本公式 函数源码
  • .NET Framework与.NET Framework SDK有什么不同?