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

目录
  • 例题描述
  • 💡 思路一 (推荐)
    • 代码实现
  • 💡 思路二
    • 代码实现
  • 引申
  • 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的访问频次,得到当前数据库是以插入,更新和删除为主还是以查询为主,如果是以插入,更新和删除为主的话,那么优化比重可以轻一点儿。 语法: …

element-plus_message.js

message.js import { ElMessageBox, ElNotification } from "element-plus"; import { VNode } from "vue"; import { AxiosResponse } from "axios";let timeout; export default ({ title "确认", message, okEms, errMes, okText…

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

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

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

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

文件的版本管理

前提 现在在做一个在线生成文档的东西,就是用户填写的时候都是结构化的东西,不如单选框,多选框,富文本,图片之类的,最后要给用户生成文档或者ppt,或者pdf,然后要做一个版本对比的功…

代码随想录算法训练营第36天| 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 完成 思路: 本题的贪心策略是,把区间按左端从小到大排序,当碰到重叠区间时,优先去掉右端更大的,减少后续重叠的可能。也可以理解为优先保留跨度更小的区间,跨度小的区间和其他区间重叠的可…

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

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

备战蓝桥杯 Day6(学习动态规划)

引入 支付问题 假设有无限多的硬币,硬币面值为1,5,11。现在需要支付15元,问最少使用的硬币数? 贪心策略:1511*11*4,145 真正的答案153*5 3 dp的两个性质 最优子结构无后效性 dp的两大要素 1.状态2.状态转移方程 思路…

掘根宝典之C++包含对象的类,私有继承,保护继承,三大继承方式总结

包含对象成员的类 包含&#xff0c;组合和层次化&#xff1a;一个类里面的类成员之一是个类对象 我们来看个例子 #include<iostream> using namespace std; class AA { private:int a_; public:AA(int a):a_(a){}void A(){cout << a_ << endl;} }; class …

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

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

全栈笔记_浏览器扩展篇(插件开发 - 发送axios请求)

axios简介 是一个基于promise的HTTP库兼容浏览器和node.js环境,在浏览器中会创建XMLHttpRequests请求,在node.js中会创建http请求axios请求封装 安装依赖:yarn add axios 创建实例: 使用自定义配置新建一个 axios 实例 import axios from "axios"; const axiosIn…

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

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

PyCharm 主题和字体 (Scheme Editor Font)

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

DockerFile的应用

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

网络安全威胁杂谈

网络安全发展到现在&#xff0c;安全最大的威胁是什么&#xff1f;答案&#xff1a;漏洞、恶意软件 全球发生的大多数的网络安全事件&#xff0c;基本都是由于漏洞、恶意软件发起攻击的&#xff0c;可以说如果解决这两类问题&#xff0c;基本上可以解决大多数的网络安全问题&am…

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

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

随手写的小程序2 一个nc能控制的程序

小程序源代码 下载: https://download.csdn.net/download/nn_84/88846445?spm1001.2014.3001.5501 请下载 Qt 5.12.12 server.pro : QT gui networkCONFIG c11 console CONFIG - app_bundle# You can make your code fail to compile if it uses deprecated APIs. # In o…