【算法专题--链表】反转链表II--高频面试题(图文详解,小白一看就会!!!)

ops/2024/10/19 3:32:49/

目录

一、前言

二、题目描述 

三、解题方法

⭐迭代法 --- 带哨兵位(头节点) 

🥝 什么是哨兵位头节点?

🍍 解题思路 

四、总结与提炼

五、共勉 


一、前言

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

二、题目描述 

      给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 

 三、解题方法

⭐迭代法 --- 带哨兵位(头节点) 

🥝 什么是哨兵位头节点?

 首先,先来了解一下什么是  哨兵位---头节点 

  • 它是一个附加的链表结点,该 结点 作为第一个节点它的数据域不存储任何东西,只是为了操作的方便而引入的。
  • 也就是说,如果一个链表有哨兵节点的话,那么链表表的第一个元素应该是链表的第二个节点。

 哨兵位 --- 头节点的作用: 

  •  比如链表中插入一个节点,对于没有哨兵位链表当待插入的节点为链表的第一个节点,由于没有前驱,需要进行特殊处理,从而代码的复杂性增加。
  • 如果有哨兵位头节点,则第一个节点的处理方式与其它节点相同,可以统一进行处理

🍍 解题思路 

  •  这道题,其实就是之前讲过的 ---- 反转链表 --- 的升级版
  • 如果我们把要 反转的区间 抽取出来,看作一个独立的链表,那么其反转的过程与反转链表的过程是一样的。 

  •  而现在我们比 反转链表 多了一步是,我们要把抽取出来反转后的区间在拼接回去

 为了把反转后的局部链表拼接回去,我们需要知道四个定位节点:

  • reversePre:   反转区间的前一个节点
  • reverseHead:反转区间的头节点
  • reverseTail:   反转区间的尾节点
  • reverseNext: 反转区间的下一个节点

我们要把反转后的链表拼接回去,实际上就是让 reversePrenext指针 指向 reverseTail,让reverseHeadnext指针 指向 reverseNext。

  • 题目中的 left right 的数值分别表示第几个节点,我们可以使用一个变量 count 来统计当前节点是第几个节点,初始值为1
  • 当反转区间的头节点为 head 时,head 之前没有节点了,为了统一,我们在头节点之前引入哨兵位头节点 --- pre_head

  • 我们从 哨兵位 头节点开始依次遍历节点,直到 count=left 时,刚好到达 reversePre

  •  然后从 reversePre 的下一个节点开始,即 reverseHead,依次反转局部链表,直到 count > right

  •  开始反转局部链表,采用三指针迭代法,可以和之前的 反转链表 一样

  •  最后将重定向 reversePre 的 next指针 和 reverseHead的 next,即将反转后的局部链表重新拼接。

  •  最后,返回 哨兵位头节点 的 next 指针

 代码:

class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {// 创建一个 哨兵位的 头节点 ,并初始化 值域为 0// 并将 其的 next 指向 head ---- >  pre_head->next = head;ListNode* pre_head = new ListNode(0 , head);// 定义反转区间 头节点的上一个节点 ,初始先这只为 哨兵尾--preListNode* reversePre = pre_head;// 节点编号 --- 开始指向 哨兵位 初始值为 1int count = 1;// 找到 反转区间 的头节点 的上一个节点// 注意 left 是从 head 开始计算的哦!while(count < left){reversePre = reversePre->next;count++;}// 获取 反转区间的 头节点ListNode* reverseHead = reversePre->next;// 反转区间 [left , right]ListNode* last = nullptr;ListNode* cur = reverseHead;ListNode* next;while(count<=right){next = cur->next;cur->next = last;last = cur;cur = next;count++;}// 重新连接反转后的节点reversePre->next = last;  // 反转区间前一个节点应该连接到反转区间的最后一个节点,即当前的lastreverseHead->next = cur;  // 反转区间的头节点应该连接到反转区间的下一个节点,即当前的next// 返回哨兵尾的 下一位return pre_head->next;}
};

  四、总结与提炼

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

五、共勉 

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


http://www.ppmy.cn/ops/48678.html

相关文章

One能聊天接入百度千帆大模型 —— 文心一言

One能聊天介绍&#xff1a;基于ChatGPT实现的微信小程序&#xff0c;适配H5和WEB端。包含前后端&#xff0c;支持打字效果输出流式输出&#xff0c;支持AI聊天次数限制&#xff0c;支持分享增加次数等功能One能聊天开源地址&#xff1a;https://github.com/oldinaction/ChatGPT…

前端 CSS 经典:在 Vue3 中使用渐进式图片

1. 什么是渐进式图片 当我们网站会加载很多图片的时候&#xff0c;有些图片尺寸很大&#xff0c;加载就会很慢&#xff0c;会导致页面长时间陷入白屏状态&#xff0c;用户体验很不好。所以可以使用渐进式图片&#xff0c;先给用户展示模糊图&#xff0c;这些图尺寸小&#xff…

【QT】QSettings读取中文乱码

解决QSettings读取中文乱码 QString sConfigFile sDataDir QDir::separator() "config" QDir::separator() "Info.ini";QSettings configFile(sConfigFile, QSettings::IniFormat);configFile.setIniCodec("utf-8");QSettings存储格式 Nat…

【论文阅读】Activity Recognition using Cell Phone Accelerometers

Activity Recognition using Cell Phone Accelerometers 引用&#xff1a; Kwapisz J R, Weiss G M, Moore S A. Activity recognition using cell phone accelerometers[J]. ACM SigKDD Explorations Newsletter, 2011, 12(2): 74-82. 论文链接&#xff1a; Activity recogn…

注册中心理论学习

注册中心介绍 注册中心&#xff08;也称为服务注册中心或服务发现服务&#xff09;是微服务架构中的一个关键组件&#xff0c;它负责服务的注册与发现。在微服务体系中&#xff0c;服务实例的数量和位置是动态变化的&#xff0c;注册中心提供了一个集中的地方来存储这些信息&a…

Mysql5.7安装教程(详细图解教程)_mysql5.7下载

本文讲解的是mysql5.7安装包、mysql5.7下载、mysql5.7安装配置教程、离线安装mysql5.7。MySQL 5.7 是 MySQL 数据库的一个重要版本&#xff0c;它引入了许多新特性和改进&#xff0c;旨在提高性能、安全性和易用性。 MySQL 5.7 在所有负载模型上都有显著的性能改进&#xff0c…

嵌入式硬件VS软件,到底哪个更难?

在嵌入式系统开发中&#xff0c;硬件和软件是密不可分的两个方面。但是&#xff0c;究竟是硬件开发更具挑战性&#xff0c;还是软件开发更难以应对呢&#xff1f;本文将就这一问题展开讨论&#xff0c;探究嵌入式硬件和软件在开发过程中的各种挑战与特点。 一、硬件开发&#…

C++程序员笔试训练

面试题1&#xff1a;使用库函数将数字转换位字符串 考点&#xff1a;c语言库函数中数字转换位字符串的使用 char *gcvt(double number, int ndigit, char *buf);参数说明&#xff1a; number&#xff1a;待转换的double类型数值。 ndigit&#xff1a;保留的小数位数。 buf&am…