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

news2024/10/5 20:27:16

文章目录

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


前言

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


链表反转|指定区间内

参考题目: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.coloradmin.cn/o/812794.html

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

相关文章

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-1:任务)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

1.2 网络安全法律法规

数据参考&#xff1a;CISP官方 目录 国家立法体系网络安全法解析网络安全相关法律 一、国家立法体系 1、我国的立法体系 我国的立法体系在网络空间治理中扮演着基础工作的角色。为了应对快速发展的网络技术和威胁&#xff0c;我国采取了多级立法机制来完善网络空间的法律…

在OK3588板卡上部署模型实现OCR应用

一、主机模型转换 我们依旧采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 安装rknn-toolkit2&#xff08;该工具不能在OK3588板卡上完成模型转换&#xff09; git clone https://github.com/rockchip-linux/rknn-to…

学习中遇到的好博客

c日志工具之——log4cpp ECU唤醒的本质就是给ECU供电。 小文件&#xff1a;零拷贝技术 传输大文件&#xff1a;异步 IO 、直接 IO&#xff1a;如何高效实现文件传输&#xff1a;小文件采用零拷贝、大文件采用异步io直接io (123条消息) Linux网络编程 | 彻底搞懂…

ChatGPT 是如何工作的:从预训练到 RLHF

欢迎来到人工智能的未来&#xff1a;生成式人工智能&#xff01;您是否想知道机器如何学习理解人类语言并做出相应的反应&#xff1f;让我们来看看ChatGPT ——OpenAI 开发的革命性语言模型。凭借其突破性的 GPT-3.5 架构&#xff0c;ChatGPT 席卷了世界&#xff0c;改变了我们…

lop和wlop

文章目录 lop概要lop定义不动点迭代lop算法lop应用lop算法实验结果 wlop 写在前面的话&#xff1a;论文的证明和一些公式具有一定的跳跃性&#xff0c;而且可能我没有L1稀疏平滑相关的理论基础知识&#xff0c;导致这篇文章我看了很久&#xff0c;也只是看懂个大概&#xff0c;…

校园基础设施资源管理

背景 自2017年起&#xff0c;为响应两会提出的“数实融合”“数字经济”“数字中国”的中国经济发展新动向&#xff0c;满足“中国教育现代化2030”战略部署&#xff0c;进一步推动“教育信息化十三五规划”的落实。这五年时间&#xff0c;各大高校致力于深化信息技术与教育教…

舌体分割的初步展示应用——依托Streamlit搭建demo

1 前言 去年在社区发布了有关中医舌象诊断的博文&#xff0c;其中舌象识别板块受到了极高的关注和关注。&#x1f60a;最近&#xff0c;我接触到了Python的Streamlit库&#xff0c;它可以帮助数据相关从业人员轻松搭建数据看板。本文将介绍如何使用Streamlit构建舌体分割的演示…

Mac上VScode无法提示Unity代码

这个问题困扰了我将近三天&#xff0c;网上大部分文章对我都无效。终于解决了&#xff0c;留个记录文章&#xff0c;希望能帮到其他人。 前言 Unity在Mac上只与VS绑定&#xff0c;但是VS在Mac上太难用了&#xff0c;没有插件&#xff0c;界面也丑。VScode虽然好用插件多&…

力扣 -- 978. 最长湍流子数组

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int maxTurbulenceSize(vector<int>& nums) {int nnums.size();vector<int> f(n);…

docker简单web管理docker.io/uifd/ui-for-docker

要先pull这个镜像docker.io/uifd/ui-for-docker 这个软件默认只能使用9000端口&#xff0c;别的不行&#xff0c;因为作者在镜像制作时已加入这一层 刚下下来镜像可以通过docker history docker.io/uifd/ui-for-docker 查看到这个端口已被 设置 如果在没有设置br0网关时&…

并查集基础

一、概念及其介绍 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的的树根&#xf…

DataWhalePaper:知识图谱处理时序序列小样本

Outline 背景 很多概念会随着时间漂移&#xff0c;时序图谱 动机 使用手头微小的数据推导未见的数据很多知识会随着时间发生变化&#xff0c;建模时间漂移 模型 问题定义&#xff1a; 时序知识图谱&#xff0c;四元组表示(e,r,e,t) 学习目标 框架&#xff0c;基于手头的数据…

小研究 - 一种复杂微服务系统异常行为分析与定位算法(一)

针对极端学生化偏差&#xff08;&#xff25;&#xff58;&#xff54;&#xff52;&#xff45;&#xff4d;&#xff45; &#xff33;&#xff54;&#xff55;&#xff44;&#xff45;&#xff4e;&#xff54;&#xff49;&#xff5a;&#xff45;&#xff44; &#…

【C++】多态的实现及其底层原理

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、什么是多态&#xff1f;二、多态的构成条件2.1什么是虚函数&#xff1f;2.2虚函数的重写2…

【简化程序设计】C++STL“容器适配器“之栈和队列

【STL】容器适配器之栈和队列 stack的介绍和使用stack的介绍stack的使用stack的模拟实现 queue的介绍和使用queue的介绍queue的使用queue的模拟实现 priority_queue的介绍和使用priority_queue的介绍priority_queue的使用priority_queue的模拟实现 容器适配器什么是容器适配器&…

【数据分享】1999—2021年地级市文化/体育/卫生/社会保障等公共服务相关指标(Excel/Shp格式)

1999-2021年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、地方一般公共预算收支状况、工业企业数、固定资产投资和对外经济贸易数据、科技创新指标数据、劳动力就业及…

一起学算法(枚举篇)

概念 枚举&#xff1a;就是把满足题目条件的所有情况都列举出来&#xff0c;然后一一判断寻找最优解的过程 1.最值问题 1.两个数的最值问题 两个数的最小值&#xff0c;利用Java的运算符就可以实现 int Min(int a,int b){return a<b?a:b; } 2.n个数的最值问题 当有n…

禁用右键菜单AMD Software: Adrenalin Edition

本文参考链接&#xff1a; 删除win11右键一级菜单的AMD驱动栏 - 哔哩哔哩 windows11 求助删除右键菜单方法_windows11吧_百度贴吧 Windows安装最新的AMD显卡驱动后&#xff0c;右键菜单会多出AMD Software: Adrenalin Edition。使用一些右键菜单管理工具也没能屏蔽禁用掉该功…

机器学习---线性回归、多元线性回归、代价函数

1. 线性回归 回归属于有监督学习中的一种方法。该方法的核心思想是从连续型统计数据中得到数学模型&#xff0c;然后 将该数学模型用于预测或者分类。该方法处理的数据可以是多维的。 回归是由达尔文的表兄弟Francis Galton发明的。Galton于1877年完成了第一次回归预测&…