当前位置: 首页 > 编程日记 > 正文

全面分析再动手的习惯:链表的反转问题(递归和非递归方式)

定义一个方法(函数),实现输入一个链表的头结点,然后可以反转这个链表的方向,并输出反转之后的链表的头结点。

typedef struct Node{int data;Node *next;
} Node, *List;

链表类的问题,涉及到了很多指针的操作,需要严谨的分析,全面的分析问题之后,在开始写代码,磨刀不误砍柴工!反转链表,直接的想法,就是把链表中指针的方向反转就可以了,如图所示:

假设 i 结点之前,我们把所有的结点的指针都已经反转了,那么自然 i 和以后的结点链接发生了断裂!如下图;

这样的话,无法继续遍历 i 以后的结点了,那么自然想到,在断链之前,提前保存之前的状态。那么自然想到定义三个指针,分别指向当前结点 i,i 的后继 j,i 的前驱 h 结点。保存断链之前的三个结点的连接状态。然后,假设没问题了,那么继续反转完毕,最后链表的尾结点就是反正链表的头结点了,也就是 next 为 null 的结点,是原始链表的尾结点。

#include <iostream>
using namespace std;typedef struct Node{int data;Node *next;
} Node, *List;Node * reverseList(List head){//定义三个指针,保存原来的连接的状态//当前结点指针Node *pnow = head;//当前结点的前驱指针,初始化是 NULLNode *pre = NULL;//当前结点的后继指针,初始化也是 nullNode *pnext = NULL;//定义尾指针Node *tail = NULL;//开始遍历链表while(pnow != NULL){//如果当前结点不是 null,那么初始化 pnext 指针指向当前结点的下一个结点pnext = pnow->next;//如果找到了尾结点,初始化 tail 指针if(NULL == pnext){tail = pnow;}//进行链表的反转,当前结点的 next 指针指向前一个结点,实现链表方向的反转,此时发生了断链pnow->next = pre;//勿忘断链的情形,需要使用 pre 指针保存状态,pre 等价于是后移一个结点pre = pnow;//pnow 后移一个结点pnow = pnext;}return tail;
}

定义的这个三个指针,目的就是防止断链之后无法继续遍历链表以后的结点,实现全部的反转。当 pnow 的 next 指向 pnow 的前驱pre(初始化是 null)的时候,已经实现了 pnow 和前驱pre的方向反转,但是 pnow 此时就和后继pnext断链了,那么使用 pre 后移的方式,指向 pnow,同时 pnow 也后移,指向 pnext,而 pnext 继续指向更新之后的 pnow 的 next 结点即可。从而实现了状态的保存,继续遍历全部结点,实现链表反转。

注意关于链表问题的常见注意点的思考:

1、如果输入的头结点是 NULL,或者整个链表只有一个结点的时候

2、链表断裂的考虑

下面看看递归的实现方式

递归的方法其实是非常巧的,它利用递归走到链表的末端,然后再更新每一个node的next 值 ,实现链表的反转。而newhead 的值没有发生改变,为该链表的最后一个结点,所以,反转后,我们可以得到新链表的head。

//递归方式
Node * reverseList(List head)
{//如果链表为空或者链表中只有一个元素if(head == NULL || head->next == NULL){return head;}else{//先反转后面的链表,走到链表的末端结点Node *newhead = reverseList(head->next);//再将当前节点设置为后面节点的后续节点head->next->next = head;head->next = NULL;return newhead;}
}

程序刚开始执行,if 语句失效,进入 else 语句,然后执行Node *newhead = reverseList(head->next);第二个结点的指针参数传入递归函数,一直到,最后一个结点的指针参数传入递归函数,if 语句有效head->next == NULL,返回当前的head 给 newhead 指针指向,如图:

其实在递归函数栈内,按照后进先出的顺序,执行一级级的递归函数,返回末位结点给 newhead 之后,执行递归栈里的第二个递归函数,发生如图

返回 newhead,也就是新的反转之后的链表(临时的),然后进入到递归工作栈里的第一个递归函数,如图:

返回 newhead,也就是反转之后的链表,此时递归工作栈的函数全部执行,返回的结点就是反转之后的链表的头结点(之前的尾结点)

相关文章:

Facebook 正在研究新型 AI 系统,以自我视角与世界进行交互

编译 | 禾木木出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;你是否能想象 AI 以第一人称视角来理解世界是什么样的呢&#xff1f;未来&#xff0c;以第一人称视角理解世界的 AI 可以开启沉浸式体验的新时代。增强现实&#xff08;AR&#xff09;眼镜和虚拟现实&…

docker-2-简单使用docker-ce

安装请看docker-ce安装文档 docker命令合集 参考docker --help 选项 -D 使用debug模式-l 日志级别(有debug|info|warn|error|fatal)&#xff0c;默认info-v 显示版本管理命令config 管理docker配置container 管理容器image 管理镜像network 管理网络service swarm 常用命令atta…

Apache启用mod_expires模块

mod_expires可以减少10%左右的重复请求&#xff0c;让重复的用户对指定的页面请求结果都CACHE在本地&#xff0c;根本不向服务器发出请求。 在使用之前,首先要确认一下”mod_expires”模组是否有启用.如果是自己安装Apache来架设网页主机的话,这里我们可以透过编辑Apache的”ht…

用 Pyecharts 制作炫酷的可视化大屏

作者 | 俊欣来源 | 关于数据分析与可视化前两篇Pyecharts的文章来帮我们简单的梳理了一下可以用Pyecharts来绘制哪些图表之后&#xff0c;本篇文章我们用pyecharts里面的一些组件&#xff0c;将绘制的图表都组合起来首先Grid组件首先介绍Pyecharts模块当中的Grid组件&#xff0…

compass安装使用960 Grid System

960 Grid System 是一个CSS的页面布局框架 demo: http://960.gs/demo.html 前提&#xff1a;安装Ruby 、NodeJS 步骤1&#xff1a;在命令行下安装css插件&#xff1a; gem install compass-960-plugin 步骤2&#xff1a;创建my_project项目&#xff1a; compass create -r nin…

C语言竟成TIOBE年度编程语言候选!苹果iPhone 7卖得最好!

每年这个时候&#xff0c;都是TIOBE榜单评选年度编程语言的时候。今年&#xff0c;Kotlin成为竞争的热门&#xff0c;让人意外的是&#xff0c;C语言居然也成为了候选编程语言之一。自从被Java摘走王者桂冠&#xff0c;C语言几乎是处于持续下滑状态&#xff0c;没想到2017年竟然…

奇怪吸引子---QiChen

奇怪吸引子是混沌学的重要组成理论&#xff0c;用于演化过程的终极状态&#xff0c;具有如下特征&#xff1a;终极性、稳定性、吸引性。吸引子是一个数学概念&#xff0c;描写运动的收敛类型。它是指这样的一个集合&#xff0c;当时间趋于无穷大时&#xff0c;在任何一个有界集…

简介+原理+绘制,详解 Python「瀑布图」的整个制作流程!

作者|黄伟呢来源|数据分析与统计学之美简介瀑布图&#xff0c;由麦肯锡顾问公司所独创的图表类型&#xff0c;因为形似瀑布流水&#xff0c;所以被大家称之为瀑布图(Waterfall Plot)&#xff0c;在企业经营分析、财务分析中使用较多&#xff0c;用以表示企业成本的构成、变化等…

Ubuntu 忘记root登录密码的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 之前做了个虚拟机&#xff0c;最近需要用到&#xff0c;密码忘记了&#xff0c;下面是在忘记密码的情况下登录系统休修改密码&#xff0c;需要进入GRUB修改kernel镜像启动参数 1、重启电脑长按shift键直到进入下图进入GR…

10月21日!API 大赛决赛暨移动云开发者论坛邀您见证数字创新的力量

2021年7月&#xff0c;移动云API应用创新开发大赛正式启动&#xff0c;历时近两个月的时间&#xff0c;共计报名889人&#xff0c;最终提交作品166项。经过前期初审、初赛、复赛等环节&#xff0c;最终企业、移动和高校赛道共29个目团队成功问鼎移动云API应用创新开发大赛决赛榜…

负载均衡环境中和如何设置Expires和Etag

在负载均衡环境中&#xff08;LVS, LoadBalance&#xff09;为了减少浏览器数据的重复请求操作&#xff0c;一般需要设置 Http Header 的 Etage 和 Expires 告诉浏览器请求数据是否已过期。以下内容主要考虑Apachesquid 环境 ETag Header是文件修改时间、文件大小和inode号生成…

C++之typedef 小记

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;&#xfeff; 以前曾不知道为何要用typedef&#xff0c;随着开发的深入&#xff0c;真正感受到了其内涵所在&#xff1a; 1.如&#xff1a;typedef int DataType 接下来项目中的几万行代码中&#xff0c;如果…

Android Go初探

Android Ore(Go edition) 简介&#xff1a; Android Go并不是一个独立的操作系统&#xff0c;它只是Android O的一种轻量级配置方案&#xff0c;专为1GB以下内存的机型设计&#xff0c; 在这种设置下&#xff0c;一些消耗大量资源的功能将被关闭&#xff0c;同时预装的应用也是…

Apache HTTP Server Version 2.2 文档中文版

模块索引 | 指令索引 | 常见问题 | 词汇表 | 站点导航 Apache HTTP Server 版本2.2 Apache > HTTP Server > 文档 > 版本2.2致谢 | 本篇译者&#xff1a;金步国(其他作品) | 本页最后更新&#xff1a;2006年10月20日[查看最新版本] 电信镜像 网通镜像Apache HTTP Ser…

归一化变换 Normalizing transformations

归一化变换包含两个部分&#xff0c;图像坐标的平移和尺度的缩放。进行归一化的变换不但能够提高处理结果的精确度&#xff0c;而且通过选择一个标准的坐标系预先的消除了图像尺度和坐标原点的选择对算法最终结果的影响。 归一化变换的步骤&#xff1a; 对点进行平移&#xff0…

Arm 通过虚拟硬件与新的解决方案导向的产品 带动物联网经济转型

Arm物联网全面解决方案通过一套全栈式解决方案&#xff0c;大幅加速产品开发进程并提高投资回报率&#xff1b;Arm虚拟硬件使得开发无需基于实体芯片进行&#xff0c;促成软件与硬件的共同设计&#xff0c;让产品开发时间最多缩短两年&#xff1b;Project Centauri作为Arm新的生…

数据库设计 之设计 表字段类型

2019独角兽企业重金招聘Python工程师标准>>> 数据库设计 之设计 表字段类型 博客分类&#xff1a; sql 之前没有 数据库设计的一些经验。 这次数据库设计。由于需求原因和没经验原因。 一些数字类型的字段设计成了varchar2 一些日期类型的字段也设计成了varchar2 一…

Apache关掉Etag和Last-Modified的方法

Apache关掉Etag和Last-Modified的方法,可能也只有我这种无聊的人才会做这种事情.哈哈&#xff0c;关掉etag和last-modified会出现什么样的情况。做一个这样的测试. 不要问我这二个参数是做什么的。。。。。在我的blog中有写. Etag关掉的方法如下,加一个none FileETag none …

P2P最易遭受的DDoS***以及防御手段

从07年的爱沙尼亚DDoS信息战&#xff0c;到2009年广西南宁30个网吧遭受到DDoS勒索&#xff0c;再到新浪网遭受DDoS***无法提供对外服务500多分钟。DDoS愈演愈烈&#xff0c;***事件明显增多&#xff0c;***流量也明显增大&#xff0c;形势十分严峻&#xff0c;超过1G的***流量频…

从飞天到倚天 阿里云底层自研技术大爆发

10月20日&#xff0c;2021云栖大会上&#xff0c;阿里云发布了倚天、磐久、神龙4.0、龙蜥、灵杰等多款重磅产品&#xff0c;阿里云“做深基础”成果浮出水面&#xff0c;底层自研技术迎来大爆发。 阿里云智能总裁张建锋表示&#xff0c;过去十二年&#xff0c;阿里云打造出中国…

CSS vs. JS Animation: 哪个更快

CSS vs. JS Animation: 哪个更快? CSS vs. JS Animation: 哪个更快? 基于JavaScript的动画竟然已经默默地比CSS的transition动画快了&#xff1f;而且&#xff0c;Adobe和 Google竟然一直在发布可以媲美原生应用的富媒体移动站点&#xff1f; 这篇文章将会逐点讲解基于JavaSc…

Squid下Http头信息优先级

no-cache>Expires>refresh_pattern>Last-Modified 也就是讲,最前面的最重要,前面的生效后,后面的基本就失效了. 另外squid本身就能对比Last-Modified,但根据我的测试&#xff0c;Etag还是会要向源服务器发送请求头&#xff0c;来确认etag的. ETag默认是需要向源网站…

阿里云PolarDB数据库将云原生进行到底!业内首次实现三层池化

10月20日&#xff0c;在2021云栖大会上&#xff0c;阿里云宣布自研云原生关系型数据库PolarDB重磅升级&#xff0c;实现内存池化、多主架构、HTAP实时分析等创新功能&#xff0c;进一步引领云原生数据库技术的持续创新。 阿里云智能数据库事业部总负责人李飞飞表示&#xff0c;…

zencoding实践

2019独角兽企业重金招聘Python工程师标准>>> .container<div class"container"></div>.wrap>ul>.list>.site <div class"wrap"><ul><li class"list"><div class"site"></…

第三期 OSI七层中第一层 物理层

物理层1、信号1&#xff09;信息2&#xff09;数据3&#xff09;信号&#xff1a;信息传递的媒介 4&#xff09;信号的分类&#xff1a;模拟信号&#xff1a;连续变化的物理量。数字信号&#xff1a;不连续的物理量&#xff0c;信号参数也不连续变化&#xff0c;高低固定。5&am…

Squid的refresh_pattern配置

refresh_pattern 大概是 squid 最有意思但最不好懂的配置参数了。 记住refresh_pattern 只对后端没设置Expires过期时间的页面起作用&#xff0c;比如论坛页面&#xff1b;而对类似apache mod_expires 设置过的页面不起作用。 说明之前&#xff0c;先将个概念LM&#xff0c;L…

阿里云发布第四代神龙架构云计算首次进入5微秒时延时代

10月20日&#xff0c;2021云栖大会上&#xff0c;阿里云宣布推出第四代神龙架构&#xff0c;这是飞天云操作系统新一代虚拟化技术&#xff0c;首次搭载全球唯一的大规模弹性RDMA加速网络&#xff0c;网络延迟整体降低80%以上。神龙4.0带来的计算架构革新&#xff0c;将云计算首…

【微服务】Spring-Boot整合Consul (自定义服务配置及健康检查)

为什么80%的码农都做不了架构师&#xff1f;>>> 目的 上文提到仅使用discovery包自带的注册功能进行服务注册&#xff0c;但是由于监控的是 /health&#xff0c;使用actuator实现自由度不够&#xff0c;并且有些低级异常可能不完全影响服务运行&#xff0c;但状态依…

Apache URL重定向避免网址结尾斜线问题

结尾斜线问题描述: 每个网主都曾受到结尾斜线问题的折磨&#xff0c;若在URL中没有结尾斜线&#xff0c;服务器就会认为URL无效并返回错误&#xff0c;因为服务器会根据/~quux/foo去寻找foo这个档案&#xff0c;而非显示这个目录。其实很多时候&#xff0c;这问题应留待用户自己…

16:00面试,16:08就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。好在有个兄弟内推我…