一学就会----反转链表

news2024/11/8 19:47:36

文章目录

  • 题目描述
  • 思路一
  • 思路二

题目描述

反转一个单链表。

图片示例:

在这里插入图片描述

思路一

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

在这里插入图片描述

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

一、一般情况
要使两个结点之间的指针指向反转,看似用两个变量足矣,直接让后一个结点指向前一个结点。但是仔细思考后发现并没有那么简单,我们如果直接让后一个结点指向前一个结点,那么后一个结点所指向的再后面一个结点的位置就无从知晓了。所以,我们还得定义3个指针变量:n1,n2,n3 。

n1:记录指针指向将要反转的结点反转后要指向的位置。
n2:记录指针指向将要反转的结点。
n3:记录指针指向将要反转的结点的下一个结点。

在这里插入图片描述

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

在这里插入图片描述

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

二、极端情况
极端情况,也就是反转第一个结点指针的指向和反转最后一个结点指针的指向,以及传入的链表为空时的情况。

1.传入的链表为空时
我们可以发现,若传入的链表为空,那么我们根本就不需要对链表进行任何操作,直接返回传入的头指针即可。如果再稍加思考,当传入链表只有一个结点时,我们也不需要对链表进行任何操作,直接返回传入的头指针也没问题。

2.反转第一个结点指针的指向时
因为n2记录的是指针指向将要反转的结点,所以当反转第一个结点指针的指向时,n2指针便指向的是第一个结点。

在这里插入图片描述

因为在我们反转过程中就是让n2指向的结点指向n1指向的位置,所以我们只需将n1的初始值赋值为NULL即可。这样,反转后就让第一个结点指针指向NULL了(即反转后的最后一个结点指向空)。

3.反转最后一个结点指针的指向时
当最后一个结点的指针指向被反转时,n2刚好指向最后一个结点,在指针反转完成后,n1,n2,n3指针统一向后移动,位置如下:

在这里插入图片描述

我们可以发现逻辑上是没有问题的,而且此时也发现了遍历链表时的终止条件和需要返回的新的头指针,即当n2指针为NULL时停止遍历,并且返回n1指针指向的位置。但是,我们这里需要注意,这时这3个指针统一后移时,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指针指向的位置
}

思路二

如果你觉得上面这种思路有点绕的话,那么不妨看看下面这种思路:将原链表的结点,从头到尾一个个地拿下来头插到一个新链表中,这个新链表起始时为一个空链表。

在这里插入图片描述

这样依次进行下去,最终就能得到一个“反转后的链表”。

代码示例:

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;//返回反转后的头指针
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHY6230国产蓝牙BLE5.2 2.4G SoC低成本遥控灯控芯片

PHY6230是高性价比低功耗高性能Bluetooth LE 5.2系统级芯片,集成32-bit高性能低功耗MCU,16KB OTP,8KB Retention SRAM和64KB ROM,可选EEPROM,适用多种PC/手机外设连接、遥控、灯控等场景。 特点: 高性能多…

Python数据攻略-Pandas的数据计算和清洗整理

大家好,我是Mr数据杨,今天带大家以《三国演义》为背景,探索Python数据处理的奥秘。 将眼光投向谋士们,他们就如同Python的算术运算和NumPy、SciPy函数,精准的计算和预测是他们的必备技能。比如,郭嘉分析敌…

使用 GMDH 进行时间序列预测

目录 主要命令 CreateTimeSeriesData FitPolynomial GetPolynomialLayer 分组数据处理方法(GMDH) PLOT 主要命令 采用分组数据处理方法(GMDH)对全球冰体积时间序列的建模和预测 fsz size(A) 返回一个行向量,其元…

创建好的提示词来让 Stable Diffusion 生成 AI 艺术作品图像

如何创建好的提示词来让 Stable Diffusion 生成 AI 艺术作品图像? 文章目录 Stable Diffusion如何使用?优秀的提示词如何制作?主题描述 Subject图片类型风格艺术感觉相机、镜头、渲染 示例基础绘图光线和颜色的变化图片类型美术风格艺术风格组…

springboot+java校园二手物品交易系统vxkyj

本项目在开发和设计过程中涉及到原理和技术有: B/S、Java、Jsp、MySQL数据库等等。 系统有以下几点意义: (1)提供用户和用户之间互利互惠的交易平台。 (2)操作简单,用户可以在家里就能淘到自己想要的东西&a…

祝贺!Databend 入选 ICT 中国可信云优秀云原生创新案例

2023 年 6 月 6 日,由工业和信息化部主办,中国信息通信研究院(以下简称“中国信通院”)、中国邮电器材集团有限公司承办、创原会协办的“ ICT 中国 2023 高层论坛-云原生产业发展论坛”在北京召开。本届论坛以“云智原生新底座&am…

【C++】包装器-bind function

文章目录 包装器function包装器function包装器介绍function包装器统一类型function包装器简化代码的列子function包装器的意义 bind包装器bind包装器介绍bind包装器绑定固定参数bind包装器调整传参顺序bind包装器的意义 包装器 function包装器 function包装器介绍 function包…

【Axure教程】通过输入框动态维护可视化图表

与静态图表相比,动态图表更能吸引观众的眼球并提供更好的视觉效果。动态元素可以吸引观众的注意力,使数据更生动、更具交互性。这有助于提高信息传达的效果,并能够引起观众的兴趣和参与。所以今天作者就教大家,如果通过输入框元件…

[NOIP2003 提高组] 加分二叉树

[NOIP2003 提高组] 加分二叉树 题目描述: 设一个 n 个节点的二叉树 tree 的中序遍历为(1,2,3,…,n),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di​,tree 及它的每个…

优雅草蜻蜓T系统·专业版服务端以及后台部署说明-完整步骤-语音会议室支持多人语音,屏幕分享,导航配置,会议管理,会员管理

蜻蜓T系统专业版服务端以及后台部署 1,解压文件和基础环境配置 将源码用git工具克隆到/www/wwwroot git clone git地址 或者是由优雅草发送的商业源码文件包直接进行解压 ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选)…

十分钟柔和护理,轻松舒缓眼疲劳,云康宝眼部按摩仪体验

平时工作、生活中,每天都要长时间对着手机、电脑等电子设备,像是被它们吸走了灵魂,有时候眼睛干干的、痛痛的,像是被沙子刮过,光靠眼药水之类的东西根本解决不了问题,所以趁着618我入手了一款眼部按摩仪&am…

数字系统。网络层。IPv4 子网划分。ICMP

嘿,伙计们!我希望你们一切都好。作为我每周更新计算机网络的一部分,我想分享一些令人兴奋的话题。 首先,我们深入研究了数字系统的世界。本主题重点介绍二进制和IPv4地址,我们学习了如何将二进制转换为十进制&#xf…

Zookeeper部署

Zookeeper的安装 环境变量的配置 上传安装包 使用MobaXterm、FinalShell或者使用scp将安装包apache-zookeeper-3.6.3-bin.tar.gz上传到/root/softwares下 复制代码 解压安装 [rootqianfeng01 ~]# tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C /usr/local 复制代码 更名 …

1091 Acute Stroke (PAT甲级)

这道题用dfs做的话,因为递归太多层,堆栈溢出,有两个测试点过不了;所以用bfs。 但令我百思不得其解的是,我没用方向变量x[6], y[6], z[6],直接老老实实算每一个方向的话,最后一个测试点过不了&a…

17.6:迪瑞克斯啦算法

迪瑞克斯啦算法 这个算法研究的是:有向的,没有负权重,可以有环的图。 这个算法主要研究的是:给出的节点到这张图的其他节点的最短路径是多少。用一个表表示出来。 思路: 如下图所示,我们想要求出a节点到其…

建立时间、保持时间和亚稳态

目录 一、建立时间和保持时间 二、亚稳态 三、避免亚稳态策略 四、多级寄存器阻断亚稳态传播 一、建立时间和保持时间 如图1所示,建立时间(set up time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,…

【Apache Pinot】探究 Pinot 中存储模型的设计逻辑和 Segment 详解

背景 上一篇文章中,笔者简单介绍了一下分布式数据库 Pinot 的核心组件,本文主要针对其中的存储模型会做部分讲解。 如果你对读写磁盘有不错的基础的话,看起来会更轻松一些,如果没有也没关系,我会简单讲解一下这么设计…

使用STM32进行串口实验(非中断+中断)

关于串口相关的基本知识可以看这篇文章https://blog.csdn.net/weixin_62599865/article/details/129963991?spm1001.2014.3001.5501 一.使用非中断的方式进行串口通信 串口发送/接收函数: HAL_UART_Transmit(); 串口发送数据,使用超时管理机制 HAL_…

2023最新版本Activiti7系列-Activiti7概述和入门案例

一、Activiti7概述 官网地址:https://www.activiti.org/ Activiti由Alfresco软件开发,目前最高版本Activiti 7。是BPMN的一个基于java的软件实现,不过Activiti 不仅仅包括BPMN,还有DMN决策表和CMMN Case管理引擎,并且有…

【前端 - HTML】第 1 课 - HTML 初体验

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 。 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、HTML 概念 2.1、HTML 定义 2.2、标签语法 3、HTML 基本骨架 4、标签的关系 5、注释 6、总结 1、缘起 最近在学习微信小程…