链表(2)反转链表

题目描述

反转一个单链表。(题目来源)

思路一

其实,反转一个单向链表,我们可以看成是将链表中的每个结点的指向反向(即从后一个结点指向前一个结点)。

我们在考虑情况的时候,还是可以先考虑一般情况,再考虑特殊情况。

一、一般情况

我们如果直接让后一个结点指向前一个结点,那么后一个结点所指向的再后面的结点的位置就无从知晓了,因此我们定义3个指针变量:n1,n2,n3。

n1:记录指针指向将要反转的结点反转后要指向的结点。

n2:记录指针指向将要反转的结点。

n3:记录指针指向将要反转的下一个结点。

在反转时,首先让n2指向的结点指向n1指向的位置,然后让n1,n2,n3指针统一后移,准备执行下一对结点之间指向的反转。

如此进行下去,所有结点指向都将反转。

二、极端情况

1.传入的链表为空时

若为空,直接返回头指针即可。

若传入链表只有一个结点,同上。

2.反转第一个结点指针的指向

因为在我们反转的过程中就是让n2指向的结点指向n1指向的位置,所以我们只需将n1的初始值赋值为NULL即可。

3.反转最后一个结点指针的指向

此时发现了遍历链表的终止条件和需要返回的新的头指针,即当n2指针为NULL时停止遍历,并且返回n1指针指向的位置。但是,这时这三个指针统一后移时,n3指针的后移将失败,因为n3后移前指向的是NULL,所以不能执行以下这句代码。

n3 = n3 -> next;

所以后移n3指针前需判断其是否为空。

代码实现

struct ListNode {
	int val;
	struct ListNode* next;
};

struct ListNode* reverseList(struct ListNode* head)
{
	if (head == NULL || head->next == NULL)//当链表为空或只有一个结点时,无需操作
		return head;//直接返回

	struct ListNode* n1 = NULL;//记录指针指向将要反转的结点反转后要指向的位置。
	struct ListNode* n2 = head;//记录指针指向将要反转的结点。
	struct ListNode* n3 = head->next;//记录指针指向将要反转的结点的下一个结点。
	while (n2)//n2为NULL时,停止遍历
	{
		n2->next = n1;//反转结点指向
		n1 = n2;//指针后移
		n2 = n3;//指针后移
		if (n3)//判断n3是否为NULL
			n3 = n3->next;//指针后移
	}
	return n1;//返回n1指针指向的位置
}

思路二

将原链表的结点,从头到尾一个个地拿下来头插到一个新链表中,这个新链表起始为一个空链表(newhead指向NULL)。

代码实现

struct ListNode {
	int val;
	struct ListNode* next;
};

struct ListNode* reverseList(struct ListNode* head)
{
	struct ListNode* cur = head;//记录当前待头插的结点
	struct ListNode* newhead = NULL;//新链表初始时为空
	while (cur)//链表中结点头插完毕时停止循环
	{
		struct ListNode* next = cur->next;//记录下一个待头插的结点
		cur->next = newhead;//将结点头插至新链表
		newhead = cur;//新链表头指针后移
		cur = next;//指向下一个待头插的结点
	}
	return newhead;//返回反转后的头指针
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/666896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【环境栏Composer】Composer常见问题(持续更新)

1、执行composer install提示当前目录中没有 composer.lock 文件时 No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. Composer 在执行 install 命令时会…

在龙芯安装docker compose

安装过程报错:pynacl无法安装 原因:未知 解决尝试:单独安装pynacl 执行:pip install pynacl 报错: 再次执行dockerscompose撒谎啥 少了头文件 dev,表示c编译器有问题 python是c编写的 喵的 搞了半天是我…

github有趣项目:Verilog在线仿真( DigitalJS+edaplayground)

DigitalJS https://github.com/tilk/digitaljs这个项目是一个用Javascript实现的数字电路模拟器。 它旨在模拟由硬件设计工具合成的电路 像 Yosys(这里是 Github 存储库),它有一个配套项目 yosys2digitaljs,它可以转换 Yosys 将文…

独立开发的轻量级简洁开源论坛BBS PHP源码

最新的轻量级开源论坛php源码发布啦!这是一款独立开发的论坛系统,可以帮助你快速地开发出你想要的网站。 如果你是PHP初学者,这款论坛系统非常适合你入门学习。不过,需要注意的是,由于它并没有进行商业化改造&#xf…

mysql定时备份数据库

一、使用navicat进行自动备份 1、选择自动运行;2、创建批处理作业;3、选中需要操作的数据库;4、保存; 1、设置任务计划;2、新建触发器;3、选择执行时间; 完成这些之后,就可以了。 my…

Nginx一个端口代理多个vue项目,通过不同路由转到不同系统,反向代理Apache进行文件处理

需求:由于一些因素限制,需要尽可能的少开放外部端口访问,这里将多个vue项目通过一个nginx端口进行代理,由不同的路由来确定访问哪些项目,apache同理 nginx代理多个vue项目 安装和配置nginx的基础教程这里就不写了&…

C++ | Leetcode C++题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 max(buy1, -prices[i]);sell1 max(…

【开源】在线考试系统 JAVA+Vue.js+SpringBoot 新手入门项目

目录 一、项目介绍 二、项目截图 三、核心代码 【开源】在线考试系统 JAVAVue.jsSpringBoot 新手入门项目 一、项目介绍 经典老框架SSM打造入门项目《在线考试系统》&#xff0c;包括班级模块、教师学生模块、试卷模块、试题模块、考试模块、考试回顾模块&#xff0c;项目编…

同济大学胡维老师分享经管科研范式变革下的工具与实践|和鲸社区“101数智领航计划”

5月22日&#xff0c;和鲸科技成功举办“101数智领航计划”系列直播活动&#xff0c;以“经管科研范式变革下的工具与实践”为主题&#xff0c;探讨数智时代人工智能技术对于经管领域学术研究与实践应用的影响。 活动特邀同济大学经济与管理学院助理研究员胡维老师担任主讲嘉宾…

第八十九周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.05.25-2024.05.31 学习产出&#xff1a; 一、论文 SAN: INDUCING METRIZABILITY OF GAN WITH DISCRIMINATIVE NORMALIZED LINEAR LAYER 将GAN与切片最优输运联系起来&#xff0c;提出满足方向最优性、可分离性和单射…

医院内跌倒的预测模型构建(Boruta+lightgbm+DCA分析)

医院内跌倒的预测模型构建&#xff08;BorutalightgbmDCA分析&#xff09; 跌倒有时候是很严重的事情&#xff0c;常常听说骨质疏松的老年人跌倒后造成髋骨骨折&#xff0c;导致长期卧床&#xff0c;进而导致肌肉萎缩、肺炎等等并发症&#xff0c;最终导致不良预后。医院内的跌…

【Nacos源码分析01-服务注册与集群间数据是同步】

文章目录 了解CAPBASE理论Nacos支持CP还是AP集群数据同步实现集群数据一致性源码 了解CAP CAP理论的核心观点是&#xff0c;一个分布式系统无法同时完全满足一致性、可用性和分区容错性这三个特性。具体而言&#xff0c;当发生网络分区时&#xff0c;系统必须在一致性和可用性之…

JavaSE:SE知识整体总结

1、引言 历时一个多月的学习&#xff0c;已经掌握了JavaSE的知识&#xff0c;这篇博客就来做一下SE知识的总结~ 2、数据类型和变量 Java中的数据类型分为基本数据类型和引用数据类型。 2.1 基本数据类型 基本数据类型共有四类八种&#xff1a; 四类&#xff1a;整形、浮点…

​​​​​​​Beyond Compare 3密钥被撤销的解决办法

首先&#xff0c;BCompare3的链接如下 链接&#xff1a;https://pan.baidu.com/s/1vuSxY0cVQCt0-8CpFzUhvg 提取码&#xff1a;8888 --来自百度网盘超级会员V7的分享 1.问题现象 激活之后在使用过程中有时候会出现密钥被撤销的警告&#xff0c;而且该工具无法使用&#xff…

渡众机器人自动驾驶小车运行Autoware 实现港口物流运输

Autoware 是一个开源的自动驾驶软件堆栈&#xff0c;提供了丰富的功能和模块&#xff0c;用于实现自动驾驶车辆的感知、定位、规划和控制等功能。北京渡众机器人公司将多款自动驾驶小车在多场景运行Autoware &#xff0c;它可以实现以下功能&#xff1a; 1. 感知&#xff1a;利…

小数第n位【蓝桥杯】

小数第n位 模拟 思路&#xff1a;arr数组用来记录已经出现过的a&#xff0c;在循环时及时退出。易知题目的3位即a%a后的第n-1,n,n1位。该代码非常巧妙&#xff0c;num记录3位的输出状况。 #include<iostream> #include<map> using namespace std; typedef long l…

制造企业如何通过PLM系统实现BOM管理的飞跃

摘要 在当今快速变化的制造行业中&#xff0c;产品生命周期管理&#xff08;PLM&#xff09;系统的应用已成为企业提升效率、降低成本和增强竞争力的关键。本文将探讨PLM系统如何通过其先进的BOM&#xff08;物料清单&#xff09;管理功能&#xff0c;帮助制造企业在整个产品生…

uniApp子组件监听数据的变化的方法之一

props:{//用来接收外界传递过来的数据swiperList:{type:Array,default:[]}}, swiperList&#xff1a;是父组件传递过来的值 通过 watch 监听&#xff08;在父组件中也同样可以使用&#xff0c;跟VUE的监听数据变化同理&#xff09; watch:{//监听组件中的数据变化swiperList(ol…

(深度学习记录)第TR3周:Transformer 算法详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文本的输入处理中&#xff0c;transformer会将输入文本序列的每个词转化为一个词向量&#xff0c;我们通常会选择一个合适的长度作为输入…

C. Turtle and an Incomplete Sequence

思路&#xff1a;首先如果都是-1的话&#xff0c;我们可以输出1 2循环&#xff0c;否则。 首先处理首尾的连续-1串&#xff0c;这个也很好处理&#xff0c;最后我们处理两个非-1之间的-1串。 对于左边的数a[l]和右边的数a[r]&#xff1a; 如果a[l] > a[r]&#xff0c;那么…