反转链表的三种方法--面试必考(图例超详细解析,小白一看就会!!!)

目录

一、前言

二、题目描述 

三、解题方法

 ⭐ 头插法 --- 创建新的链表

 ⭐ 迭代法 --- 三指针

 ⭐ 递归法

四、总结与提炼

五、共勉


一、前言

       反转链表这道题,可以说是--链表专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会要求我们写出多种解法来实现这道题目,所以大家需要对这道题目非常熟悉哦!!
      本片博客就来详细的讲讲解一下 反转链表的多种实现方法,让我们的面试变的更加顺利!!!

二、题目描述 

 给你 单链表 的头节点 head ,请你反转链表,并返回反转后的链表。

 三、解题方法

 ⭐ 头插法 --- 创建新的链表

        头插这种方法,就是将结点一一地插入到新链表的头前,所以我们需要先去建立出一个新的链表头,也就是我下面的这个【rhead】,通过去遍历原先的链表将这些结点一一转移过去即可

  • 定义三个 变量 cur 、newnode 、rhead 
  • cur :用于遍历整个旧链表          newnode :用于记录cur的下一个节点,防止旧链表找不到
  • rhead :新链表的头节点
// 重新创建一个链表,将之前的链表进行头插即可
struct ListNode* rphead = NULL;
// 进行指针变换
struct ListNode* cur = head;

  •  开始头插,cur 节点的 next 指向 rhead 节点,然后更新 rhead 、cur 、newnode 这三个节点
 // 用于保存下一个节点地址struct ListNode* newnode = cur->next;// 头插cur->next = rphead;rphead = cur;cur = newnode;

  •  继续同样的操作

  • 此时当【cur == NULL】时,便结束一个遍历,然后新链表的头就是【rhead】,返回即可

 完整代码:

struct ListNode* reverseList(struct ListNode* head)
{// 重新创建一个链表,将之前的链表进行头插即可struct ListNode* rphead = nullptr;// 进行指针变换struct ListNode* cur = head;while(cur!=NULL){// 用于保存下一个节点地址struct ListNode* newnode = cur->next;// 头插cur->next = rphead;rphead = cur;cur = newnode;}return rphead;
}

 ⭐ 迭代法 --- 三指针

         三指针的迭代方法,这种方法不需要在去创建一个新的头结点指针只需要在原先的链表上进行一个操作即可,也就是定义三个指针。

  • cur:指向当前链表的头
  • nextnode:指向cur的next,一样是用于保存。
  • prev:这个的话其实是用来算作链表最后一个结点指向空的。
ListNode* prev = nullptr;
ListNode* cur = head;
ListNode* nextNode = cur->next;

  • 然后将【cur->next = prev】,让原本的头【cur】作为反转后新链表的尾巴

  • 接着就是进行的一个迭代操作,首先将【cur】当前的值给到【prev】,然后将【nextnode】当前的值给到【cur】,然后让【nextnode】继续向下,这个时候其实就进行了一个迭代的操作
  • cur->next = prev;
    prev = cur;
    cur = nextnode;
  • 然后继续做翻转,让【cur->next】指向 prev, 并更新三个指针

  • 可以看到,当这个【cur == NULL】时,整个链表便完成了一个翻转,此时便结束循环迭代的逻辑

  • 然后可以看到,此时新链表的头并不是【cur】,而是【prev】,所以最后应该返回【prev】

 完整代码:

class Solution {
public:ListNode* reverseList(ListNode* head) {// 1. 迭代法// 定义三个指针ListNode* prev = nullptr;      // cur 的前一个节点ListNode* cur = head;// 开始迭代while(cur!=nullptr){ListNode* nextnode = cur->next;  // cur的下一个指针cur->next = prev;prev = cur;cur = nextnode;}return prev;}
};

 ⭐ 递归法

我们可以通过迭代的方法来得到递归方法 

  • 函数声明中 prev 指针指向的为 NULLcur 指针指向的为 head,正如递归中声明并初始化的prev cur 指针
  • 递归结束条件为 curNULL, 返回 prev
  • 同样 newnode 保存 cur 的下一个节点,以防止反转时丢失链表信息。
  • 然后进行反转 cur->next = prev;
  • prev为当前已反转部分的头节点,cur为当前待反转的节点。
  • 然后调用递归,将cur作为新的 prev 传入下一层,将 newnode 作为新的 cur 传入下一层。
  • 实现了链表的递归反转
class Solution {
public:ListNode* reverse(ListNode* prev, ListNode* cur){// 最终结束条件if(cur==nullptr){return prev;}ListNode* newnode =cur->next;cur->next = prev;// 将 cur 作为 prev 传入下一层// 将 newnode 作为 cur 传入下一层,改变其指针指向当前 curreturn reverse(cur,newnode);}ListNode* reverseList(ListNode* head) {// 3. 递归法return reverse(nullptr,head);}
};

 四、总结与提炼

         最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关链表翻转的题目,这道题目是校招笔试面试中有关链表章节非常高频的一道题目大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握

 五、共勉

       以下就是我对 反转链表 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 链表专题 的理解,请持续关注我哦!!!    

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

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

相关文章

编译 TMS320F2838x 项目

编译 tms320f28388 项目,并生成 hex 文件 介绍 C2000Ware 目录 archive 架构 boards 基于官方开发板的例子 device_support 官方驱动,建立工程重点要用到的东西(基于寄存器变量访问) docs 说明文档 driverlib 官方的驱动…

找好看的简历模板,就上这6个网站。

找好看的简历模板就上这6个网站,免费下载! 1、菜鸟图库 个人简历模板|WORD文档模板免费下载 - 菜鸟图库 站内有超多办公类素材,PPT、world、excel模板都能找到,简历模板有非常详细的分类,风格类型也很多,想…

数据库MongoDB详解

文章目录 入门指南1. 安装 MongoDB2. 启动 MongoDB 服务3. 连接到 MongoDB4. 创建数据库和集合5. CRUD 操作6. 索引7. 备份与恢复 不同场景下的应用方式:应用案例展示 入门指南 MongoDB 是一个基于分布式文件存储的非关系型数据库(NoSQL)&am…

Linux “ 软件管理 “

软件管理 widows 安装 方法一: 双击exe安装包,就可以安装。 用exe安装的软件会破记录到注册表中。 注册会记录安装位置,软件名称。 方法二: 用绿色方式进行安装。 不用写到注册表中,因此无法在开始菜单里面查看和卸…

AppInventor2有没有删除后的撤销功能?

问:不小心删除了组件,能撤回吗? 答:界面(组件)设计界面,没有撤销功能。代码(逻辑)设计视图,可以使用 CtrlZ 撤销,CtrlY 反撤销。 界面设计没有撤…

AIGC绘画设计——midjourney有哪些好用的关键词?

midjourney有哪些高级关键词? 这一期继续分享一些高级的关键词, 我有一些案例也是从其他博主那学习来的, 但为了尽可能不出错,每个案例都是自己尝试了很多次后才拿出来的。 挑选了几个效果比较好,使用场景较高的类型…

Odoo:全球用户规模最大的免费开源ERP,使用前必须关注的事项

在数字经济时代,使用企业资源规划 (ERP) 工具管理业务是优化绩效和获得最佳结果的必要条件。 Odoo作为世界上最受欢迎的免费开源企业管理软件,已成功服务全球超过1200万以上的企业用户规模,开源智造作为Odoo亚太地区的金牌服务机构&#xff…

【Mybatis】INSERT INTO 遇到NULL怎么处理?

目录标题 背景-使用Mybatis手写批量插入Insert方法测试核心代码,author字段为null,插入条件怎么写? MybatisPlus解决方案自动填充字段 Mybatis解决方案if标签处理 问题:如果不在工程里面设置默认值?如何直接使用数据库…

26-unittest之装饰器(@classmethod)

unittest中的setUp可以在每个测试方法运行前执行,有效的减少了代码量。但有个弊端,比如打开浏览器操作,执行每个测试方法前都要重新打开一次,这样就会浪费很多时间。 是否可以只打开一次浏览器,执行完所有的测试方法后…

Springboot jar运行时,将jar内的文件拷贝到文件系统中

背景 因为执行需要,需要把jar内templates文件夹下的的文件夹及文件加压到宿主机器的某个路径下, 以便执行对应的脚本文件 PS: 通过类加载器等方式,直接getFile遍历文件,在idea中运行是没问题的,但是当打包成jar运行就会…

金融科技重塑跨境支付:创新引领全球支付新纪元

一、引言 随着全球化的加速和科技的飞速发展,跨境支付作为国际贸易的“血脉”,正经历着前所未有的变革。金融科技以其强大的创新能力和技术支撑,正在重塑跨境支付领域的格局,推动全球支付行业向更加高效、安全、便捷的方向发展。本文将深入探讨金融科技如何引领跨境支付的创…

【Mongodb】Mongodb亿级数据性能测试和压测

一,mongodb数据性能测试 如需转载,请标明出处:https://zhenghuisheng.blog.csdn.net/article/details/139505973 mongodb数据性能测试 一,mongodb数据性能测试1,mongodb数据库创建和索引设置2,线程池批量…

React+TS前台项目实战(一)-- 项目初始化配置及开此系列的初衷

文章目录 前言一、初始化项目二、基础配置1. 项目目录及说明如下2. TS版本使用Craco需注意 总结 前言 前面 后台管理系统实战 系列教程暂时告一段落了,想了解全局各种配置的可自行查看。本次教程将重点介绍React前台项目的实操,关于具体的配置&#xff…

龙迅LT8712X TYPE-C或者DP转HDMI加VGA输出,内置MCU,只是IIS以及4K60HZ分辨率

龙迅LT8712X描述: LT8712X是一种高性能的Type-C/DP1.2到HDMI2.0和VGA转换器,设计用于将USB Type-C源或DP1.2源连接到HDMI2.0和VGA接收器。LT8712X集成了一个DP1.2兼容的接收器,一个HDMI2.0兼容的发射机和一个高速三角机窝视频DAC。此外&…

Python 可变长参数的魔法:灵活函数设计的秘密

哈喽,大家好,我是木头左! 什么是可变长参数? 在 Python 中,可变长参数允许你向函数传入任意数量的参数,而无需预先定义它们的个数。这为编写更加灵活和通用的函数提供了可能。可变长参数主要有两种形式&am…

记录某书请求返回406及响应{“code“:-1,“success“:false}

今天测试某个平台的爬虫时使用requests post请求正常写了个测试脚本把各种参数带上出来以后出现了406情况,和网站数据是完全一样的 以为是 X-S、X-T参接不对,但在postman里测试又是可以的成功,以为是检验了参数顺序,测试发现也没…

JavaSE基础语法合集

随着不断学习,我们已经走完了JavaSE基础语法的所有内容,博主的单独语法篇共十二篇,感兴趣的也可以去看看,内容基本一致,目录是重新排布的,数组和方法都在初识Java章节。 适合:老手复习和新手从零…

Linux下的Git应用及配置

1、卸载 2、安装 3、创建并初始化 4、配置 (附加删除语句) 5、查看(tree .git/) 6、增加和提交 7、打印日志 8、验证已操作工作

sc.tl.rank_genes_groups()问题

今天被问到了一个关于sc.tl.rank_genes_groups()的奇怪的问题 import scanpy as sc import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # from CellDART import da_cellfraction # from CellDART.utils import random_mix from…

谷歌个人开发者账号“14+20”封测没通过?你可能忽视了这个细节

众所周知,在Google play平台如果使用个人开发者账号上架应用,在提审正式版应用前,需要满足20人连续封闭测试14天的要求,不少开发者在这个阶段遇到了问题,被谷歌认为没满足要求,从而不能上架应用。 为什么你…