算法通过村第二关-链表白银笔记|指定区间反转

news/2024/5/17 13:48:55

文章目录

  • 前言
  • 链表反转|指定区间内
    • 头插法:
    • 穿针引线法:
  • 总结


前言

提示:人啊,果然跟花一样,开花前的等待无比漫长,绽放的魅力却转瞬即逝。


链表反转|指定区间内

参考题目:92. 反转链表 II - 力扣(LeetCode)

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

在这里插入图片描述
当然我们上次已经教大家怎么将一个链表翻转过来了👌,今天我们就来看看他的变题(当然难度会更高👍

依旧还是两种解法:

我们姑且😒叫他头插法穿针引线法(主要还是不会起名字🤣:

头插法:

我们先来画个图来看下效果:
在这里插入图片描述
中间状态变化:

在这里插入图片描述
当然:

如果left和right的范围很大的,正好是头节点和尾节点的话,找到left和right需要遍历一次,

反转他们的话还需要一次遍历,这样的话复杂度为O(N),但是需要遍历两次,想一下有没有遍历一次的方法有的,当然可以这样做;

整体步骤:

  1. 创建一个虚拟节点(dummyNode),per = dummyNode;
  2. 循环left - 1 次 让pre停留在letf的前一个节点上
  3. 常见cur节点(首位反转),next节点
  4. 开始反转
/*** 方法1:头插法** @param head* @param left* @param right* @return*/public static ListNode reverseBetween2(ListNode head, int left, int right) {// 设置虚拟头节点ListNode dummyNode = new ListNode(-1);dummyNode.next = head;// 用一在保留引用ListNode pre = dummyNode;for(int i = 0; i < left - 1; i++){pre = pre.next;} // 找到left的前一个节点ListNode cur = pre.next;ListNode next = null;for(int i = 0; i < right - left; i++){next = cur.next;cur.next = next.next;next.next = pre.next; // 这一点不太理解pre.next = next;}return dummyNode.next;}

穿针引线法:

这种方法思路很简单,但是书写起来很难,需要你对链表有一定的熟悉程度,话不多说,我们开始尝试一下吧🥰。

首先看下图:

在这里插入图片描述
这里写一下思路:

  1. 先将待反转的区域反转好
  2. 改变指针域(即 pre.next = right; left.next = succ)
    在这里插入图片描述
    在这里插入图片描述
    注意:链表反转值得是指针域的方向(一定要注意)

建议复习一下(不带头节点的链表反转)记住一下图:
在这里插入图片描述

/*** 基本的反转方法** @param head* @return*/public static ListNode  reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;while(cur != null) {ListNode next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}
/*** 方法2:穿针引线法** @param head* @param left* @param right* @return*/public static ListNode reverseBetween(ListNode head, int left, int right) {// 因为头节点频繁变化,使用虚拟节点可以避免这样的问题ListNode dummyNode = new ListNode(-1);dummyNode.next = head;ListNode pre = dummyNode;// 第一步找到left 和 righe 节点// 让per 做到left的前一个节点for(int i = 0; i < left - 1; i++){pre = pre.next;}ListNode rightNode = pre;// 第二步 pre 继续前进 right - left + 1 来到right节点for(int i = 0; i < right - left + 1; i++){rightNode = rightNode.next;}// 第三步 切出子链表ListNode leftNode = pre.next;ListNode cucc = rightNode.next;// 切断连接pre.next = null;rightNode.next = null;// 第四步 反转链表reverseList(leftNode);// 第五步 更改指针域(接回原来的链表)pre.next = rightNode;leftNode.next = cucc;return dummyNode.next;}

总结

这里需要重点理解一下反转链表,注意指针域的变化


http://www.mrgr.cn/p/85428582

相关文章

Vue(待续)

概念 一套用于构建用户界面的渐进式JavaScript框架 Vue可以自底向上逐层的应用&#xff1a; 简单应用:只需一个轻量小巧的核心库。 复杂应用:可以引入各式各样的Vue插件。 1.采用组件化模式&#xff0c;提高代码复用率、且让代码更好维护。 2.声明式编码&#xff0c;让编码人员…

【iOS】—— 持久化

文章目录 数据持久化的目的iOS中数据持久化方案数据持久化方式分类内存缓存磁盘缓存 沙盒机制获取应用程序的沙盒路径沙盒目录的获取方式 持久化数据存储方式XML属性列表Preferences偏好设置&#xff08;UserDefaults&#xff09;数据库存储什么是序列化和反序列化&#xff0c;…

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…

TCP/IP协议

TCP/IP 是一类协议系统&#xff0c;它是用于网络通信的一套协议集合 物理层 所谓的物理层&#xff0c;是指光纤、电缆或者电磁波等真实存在的物理媒介。这些媒介可以传送物理信号&#xff0c;比如亮度、电压或者振幅。对于数字应用来说&#xff0c;我们只需要两种物理信号来分别…

分冶算法 剑指 07 重建二叉树 排序算法:剑指45 把数组排成最小的数 10-I 斐波那契数列

来记录几个注意事项 1.vector容器里利用find&#xff08;&#xff09;函数 不同于map&#xff08;map有find方法&#xff09;&#xff0c;vector本身是没有find这一方法&#xff0c;其find是依靠algorithm来实现的。 所以要包含头文件 #include <iostream> #include <…

特定Adreno GPU的Android设备发生冻屏问题

1&#xff09;特定Adreno GPU的Android设备发生冻屏问题 ​2&#xff09;Unity版本升级后&#xff0c;iOS加载UnityFramework bundle闪退 3&#xff09;关于RectTransfrom.rect在屏幕空间中表示的相关问题 4&#xff09;Unity Mesh泄露问题 这是第345篇UWA技术知识分享的推送&a…

计算机网络——应用层

文章目录 **1 网络应用模型****2 域名系统DNS****3 文件传输协议FTP****4 电子邮件****4.1 电子邮件系统的组成结构****4.2 电子邮件格式与MIME****4.3 SMTP和POP3** **5 万维网WWW****5.1 HTTP** 1 网络应用模型 客户/服务器模型 C/S 服务器服务于许多来自其他称为客户机的主…

ElementUI Select选择器如何根据value值显示对应的label

修改前效果如图所示&#xff0c;数据值状态应显示为可用&#xff0c;但实际上仅显示了状态码1&#xff0c;并没有显示其对应的状态信息。在排查了数据类型对应关系问题后&#xff0c;并没有产生实质性影响&#xff0c;只好对代码进行了如下修改。 修改前代码&#xff1a; <…

CSS鼠标样式(cursor)

CSS cursor 属性值 属性值示意图描述auto默认值&#xff0c;由浏览器根据当前上下文确定要显示的光标样式default 默认光标&#xff0c;不考虑上下文&#xff0c;通常是一个箭头none不显示光标initial将此属性设置为其默认值inherit从父元素基础 cursor 属性的值context-menu…

学习React(四)

学习React&#xff08;四&#xff09; componentWillMount&#xff08;被放弃使用&#xff09;rendercomponentDidMountshouldComponentUpdate(nextProps,nextState)componentWillUpdate&#xff08;被放弃使用&#xff09;componentDidUpdatecomponentWillReceiveProps&#x…

Excel修改日期格式,改变日期的筛选方式

我们有两列日期数据&#xff1a; 左边这一列筛选会显示&#xff1a; 右边这一列筛选会显示&#xff1a; 修改格式&#xff0c;将【日期1】改为【日期2】 将【日期1】的格式修改为文本格式即可 修改格式&#xff0c;将【日期2】改为【日期1】 选中日期2&#xff0c;点击【数据…

7月31日每日两题

第一题:再解炸弹人 小哼最近爱上了“炸弹人”游戏。你还记得在小霸王游戏机上的炸弹人吗?用放置炸弹的方法来消灭敌人。需将画面上的敌人全部消灭后,并找到隐藏在墙里的暗门才能过关。 现在有一个特殊的关卡如下。你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可…

铁路关基保护新规:优先采购安全可信的网络产品和服务!

《征求意见稿》第十四条提到&#xff1a;运营者应当加强供应链安全保护&#xff0c;优先采购安全可信的网络产品和服务&#xff1b;采购网络产品和服务影响或者可能影响国家安全的&#xff0c;运营者应当预判网络产品和服务投入使用后可能带来的国家安全风险&#xff0c;按照国…

Openlayers实战:绘制多边形,导出CSV文件

CSV(Comma-Separated Values)是一种常用的数据交换格式,是一种纯文本文件格式。在Openlayers的交互中,经常性的我们要导出一些数据,在这个实战中,演示的是导出CSV文件。 安装依赖 npm install file-saver --save npm install papaparse --save 效果图 导出的文件 源代码…

yellowbrick:一款特征工程可视化神器!

在建立模型之前一个非常重要的工作就是做特征工程&#xff0c;而在特征工程的过程中&#xff0c;探索性数据分析又是必不可少的一部分。 本次介绍一款功能十分强大的特征工程可视化工具&#xff1a;yellowbrick&#xff0c;包括雷达、一维排序、PCA、特征重要性、递归消除、正…

k8s安装Jenkins

目录 ​编辑 一、环境准备 1.1 环境说明 二、安装nfs 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 2.6 启动nfs 2.7 其他节点安装nfs-utils 三、创建PVC卷 3.1 创建namespace 3.2 创建nfs 客户端sa授权 3.3 创建…

Github 霸榜!竟是阿里技术官的微服务分布式项目实战笔记总结

一个初创公司的老板带着他们的技术负责人来做技术交流&#xff0c;他们列了一长串问题&#xff0c;有微服务技术选型方面的&#xff0c;有技术难点方面的。这些问题如果不能快速解决&#xff0c;那么就会影响产品质量、上线进度&#xff0c;进而直接影响业务。 这是很多企业常…

CAN学习笔记1:计算机网络

计算机网络 1 概述 计算机网络就是把多种形式的计算机用通信线路连接起来&#xff0c;并使其能够互相进行交换的系统。实际上&#xff0c;计算机网络包括了计算机、各种硬件、各种软件、组成网络的体系结构、网络传输介质和网络通信计数。因此&#xff0c;计算机网络是计算机…

“程序员求职攻略:IT技术岗面试的必备技巧“

文章目录 每日一句正能量前言分享面试IT公司的小技巧IT技术面试有哪些常见的问题&#xff1f;分享总结遇到过的面试题后记 每日一句正能量 人活一世&#xff0c;不在乎朋友多少&#xff0c;不问财富几车&#xff0c;关键看在你最困难的时候&#xff0c;是否有一个伸出援手的人&…

直播预告 | 开源运维工具使用现状以及可持续产品的思考

运维平台自上世纪90年代开始进入中国市场&#xff0c;曾形成以传统四大外企&#xff1a;IBM、BMC、CA、HP为代表的头部厂商&#xff0c;还有一众从网管起家的国内厂商。2010年前后&#xff0c;出现了以Zabbix、Nagios、Cacti为代表的开源工具&#xff0c;后来又陆续出现了Prome…