【单链表反转】图文解析 链表反转

目录
  • 例题描述
  • 💡 思路一 (推荐)
    • 代码实现
  • 💡 思路二
    • 代码实现
  • 引申
  • 1. 局部反转单链表
  • 2. k个一组反转链表


例题描述

反转一个链表

示例:

  • 输入: 1->2->3->4->5->NULL
  • 输出: 5->4->3->2->1->NULL

结构体定义

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

在这里插入图片描述


💡 思路一 (推荐)

先对原链表做头删操作,再对新链表做头插

  1. 定义一个新head头指针,标记为newHead,将它初始为NULL,并非指向NULL,最后我们选择返回这个newHead指针作为新链表的头指针。
    在这里插入图片描述
  2. 定义一个结点node作为"临时中转站",初始化与否并无大影响。
  3. 进行循环遍历链表各个结点,判定head指针是否为空,即是否到达了原链表的结尾。如果不为空,说明还没有到达尾部。如果程序第一次运行就没有进入循环,说明传入了一个空链表,此时返回newHead新链表的头指针,同样返回NULL,这样处理也是合理的。
  4. 以下开始逆序链表逻辑:在当前指针不为NULL时,先对原链表做头删操作,再对新链表做头插操作。即使用循环进行操作:
  5. node指针指向传入函数链表的头指针head,两指针指向保持相同。
    在这里插入图片描述
  6. 然后让head指针指向它的next结点,此时旧链表已经完成了头删操作。第一个结点已经被"切割"下来。接下来要做的就是对新链表进行头插操作,使结点放入新链表。
    在这里插入图片描述
  7. node指针的next下一个结点指向新链表的头指针newHead,完成结点的链接,即头插入新的链表中。然后更新newHead指向为新链表的头结点。进行下一次循环。
    在这里插入图片描述8. 最终head指针指向了原链表的结尾,即为NULL,退出循环,此时新链表已经反转完毕,情况如图:
    在这里插入图片描述
  8. 最终返回新链表头指针newHead即可。

代码实现

struct ListNode *reverseList(struct ListNode* head) {struct ListNode *newHead = NULL;struct ListNode *node;while (head != NULL) {//1. 对之前的链表做头删node = head;head = head->next;//2. 对新链表做头插node->next = newHead;newHead = node;}return newHead;
}

💡 思路二

  1. 利用选择语句,找到空链表的情况,此情况返回NULL空指针,因为空链表不能反转,或者说反转之后还是一个空链表,返回空。
  2. 利用三个指针p0"前指针"、p1"当前指针"、p2"后指针"来分批处理链表元素,p0置为NULL,它将作为链表的尾结点向前推进处理,p1指向旧链表的头指针headp2指向旧链表的头指针的next结点。
    在这里插入图片描述
  3. 开始遍历链表,循环判定因子为p1,当它为空时到达链表尾部跳出循环。否则在表中执行循环内逻辑:将p1指向的当前结点的下一个结点指向p0,即前一个结点。
    此时p0NULL,那么p1的下一个结点就为空了,它现在是最后一个结点。
    在这里插入图片描述
  4. 然后将p0指针指向p1,将p1指针指向p2,注意这两步不可以调换顺序,否则正确向后挪移一位。此时完成了三个指针的一轮更迭。
  5. 判定p2指针是否为空,如果为空说明此时p2到达了链表结尾,当前指针p1的指向为最后一个结点,它的next即为空。如果不为空,将p2更新到下一个结点,进行下一次循环。
    在这里插入图片描述
  6. 下一次进行循环时,就会把截断结点链接到新链表的头部,同时更新三个指针。继续循环。
    在这里插入图片描述
  7. 循环终止条件为:p1指向了链表尾部的NULL,此时p1的前指针p0即指向了反转后的链表,它就是新链表的head头指针。此时返回p0即可。

代码实现

struct ListNode *reverseList(struct ListNode* head) {if (head == NULL) {return NULL;}struct ListNode *p0 = NULL;struct ListNode *p1 = head;struct ListNode *p2 = head->next;while (p1 != NULL) {p1->next = p0;p0 = p1;p1 = p2;if (p2 != NULL) {p2 = p2->next;}}return p0;
}

引申

好的,至此你学会了单链表整体反转的简单实现,实操中要求程序员具备举一反三的能力,以下列出2种针对此题目的衍生问题。

  • 一是并非整个单链表反转,而是指定链表的某一段区间进行反转,即局部反转链表。
  • 二是k个一组反转链表,顾名思义,例如每两个节点反转一次,操作整个链表完成处理。

有兴趣了解引申题目的同学可以移步以下博文:

1. 局部反转单链表

点击这里跳转:https://blog.csdn.net/qq_42351880/article/details/123615424

2. k个一组反转链表

点击这里跳转:https://blog.csdn.net/qq_42351880/article/details/123612673

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

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

相关文章

海外大带宽服务器连接失败:原因与解决策略

​随着全球互联网的发展,越来越多的企业和个人选择使用海外大带宽服务器来满足数据传输和业务需求。然而,在实际使用中,有时会出现服务器连接失败的问题。本文将为您分析原因并提供相应的解决策略。 一、海外大带宽服务器连接失败的原因 网络…

Java三大框架简介与比较

一、引言 在Java开发领域,三大框架——Spring、Hibernate和MyBatis,各自扮演着重要的角色。它们为开发者提供了不同的解决方案,使得开发者能够更高效地构建企业级应用。本文将分别介绍这三大框架的特点、优势以及适用场景,并对它…

PCL 计算点云AABB包围盒的体积

目录 一、AABB包围盒二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。爬虫自重,把自己当个人。 一、AABB包围盒 AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即…

MySQL性能分析1——查看频次

1、查看执行频次 查看当前数据库的INSERT,UPDATE,DELETE,SELECT的访问频次,得到当前数据库是以插入,更新和删除为主还是以查询为主,如果是以插入,更新和删除为主的话,那么优化比重可以轻一点儿。 语法: …

武汉融资融券利率最低目前是多少?4.5%!如何计算的?

融资融券利率是指证券公司提供的融资融券服务的费率,由证券公司根据市场行情情况而定,该费率由两部分组成,即融资利率和融券利率。目前市场上的融资利率最低一般是在4.5%~5%之间。 融资利率是指投资者从证券公司融资时需要按照利率支付一定的…

大路灯怎么选?五款顶级落地台灯揭秘,深度测评推荐!

现在很多家长都担心孩子的视力,其实孩子夜间的读写光源问题是家长很容易忽略的视力“隐形杀手”。许多家长都选择入手了大路灯来帮助孩子改善读写用眼时的光线环境,从而能够达到提高学习效率的同时还能够很好的保护眼睛视力,但随之照明市场的…

温湿度如何精准监测?教你一招秒速搞定!

随着科技的不断发展,温湿度监控系统在各个领域中变得越来越重要。为了满足不同行业的需求,温湿度监控系统不断创新和进化,提供更为精准、可靠的监测方案。 传统的温湿度监测手段已经无法满足当今复杂的需求,而现代的监控系统以其高…

0成本部署github前端项目流程

0成本部署github纯前端项目流程 对业内来说应该是一个比较常规的操作,对于新手来说进行过一次应该就很难忘记了,但很多人仍然是不会的,认为部署项目很难,很专业,其实现在由于这些厂商的努力,大众&#xff…

Python兼职跳过血泪史直接分享干货及平台推荐

文章目录 Python兼职种类:接私活注意事项:接单报价方式:简单公式:项目工时\*日薪+紧急程度+报价国内远程工作平台 学python能兼职挣钱吗?怎么挣钱? Python兼职种类: …

PyCharm 主题和字体 (Scheme Editor Font)

PyCharm 主题和字体 [Scheme & Editor Font] References Scheme & Editor Font File -> Settings -> Editor -> Colors & Fonts -> Font Show only monospaced fonts: 只显示等宽字体。编程时使用等宽字体效果较好。 References [1] Yon…

DockerFile的应用

DockerFile的应用 一、介绍1 构建的三步骤2 构建的过程 二、常用命令三、DockerFile案例1 创建DockerFile文件2 使用DockerFile文件构建镜像3 启动容器并验证 四 DockerFile添加数据卷 一、介绍 DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成…

负载均衡下webshell连接nginx解析漏洞、sql注入第一关

首先搭建环境找到php较低的版本改一下账号密码输入?id1 正常 输入?id1 报错 .0 输入?id1-- 正常 判断是字符型注入,闭合方式是 id是1后台看是数据表里第一行 查询id1出错前端打印出了报错信息语法错误这里是找到了库名,接下来是找表名这个方法是…

php基础学习之匿名函数

匿名函数 描述 允许临时创建一个没有指定名称的函数,使用匿名函数可以方便地创建一次性或临时的功能块。 语法 function (){ //函数体 }; 样例 (注:匿名函数定义后,需要将其赋值给一个变量,然后通过该变量来调用 这种调…

Navicat连接openGauss 5.0.0 企业版数据库

引言 在当今互联网时代,数据成为企业和组织的重要资产。为了更好地管理和分析数据,数据库管理工具起到至关重要的作用。openGauss是一款开源关系型数据库管理系统,提供了高性能、高可用性和可扩展性,它还具有安全性和数据保护的特…

(二十)springboot实战——springboot使用redis的订阅发布机制结合SSE实现站内信的功能

前言 在前面的章节内容中,我们介绍了如何使用springboot项目实现基于redis订阅发布机制实现消息的收发,同时也介绍了基于SSE机制的单通道消息推送案例,本节内容结合redis和sse实现一个常用的实战案例——站内信。实现系统消息的实时推送。 …

并发编程-基础知识

多线程概念 1 线程 是进程中的一个执行单元,负责当前进程中任务的执行。一个进程在其执行过程中,会产生很多个线程。 2 进程 是指内存中运行的一个应用程序,每个进程都有自己独立的内存空间;进程也是程序的一次执行过程&#xff…

Unity求物体关于平面镜像对称后坐标以及旋转

前言:如题,我在已知一个平面L和物体A,我希望得到镜像后的物体B的位置和旋转。 效果: 推导: 首先我们需要知道物体的对称坐标A,我们现在能已知A坐标以及平面L的法线,如果我们能得到B的坐标&…

Camtasia Studio2024中文汉化版下载安装激活图文教程

Camtasia studio 2024是一款功能强大的屏幕录制和视频编辑软件。它可以帮助用户轻松地记录电脑屏幕上的任何操作,并可以将录制的视频进行编辑和制作成高质量的视频教程、演示文稿、培训课程等。 Camtasia studio 2024具有直观的界面和易于使用的工具,包…

Shiro-04-shiro 详细架构

详细架构 下图显示了Shiro的核心架构概念,并简要概述了每个架构: 下面我们对除了核心组件的部分做一下简单的介绍: Authentication(身份验证) 身份验证是验证用户身份的过程。 也就是说,当用户通过应用…

Java基于微信小程序的乐室预约小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…