【12.24】转行小白历险记-刷算法03

昨天刷着刷着忘记笔记了,不太好复盘,今天记得

咋们就是说狠狠笔记,发现自己的短板与不足

一、链表

01--203.移除链表元素

1.方法

1.1虚拟头节点实现链表的删除操作

1.链表的删除是让上一个几点指向下一个节点的头部,但是头部节点可以直接指向下一个节点的头部

2.使用虚拟节点删除链表中的元素主要是为了简化代码逻辑,特别是在处理头节点的增删操作时,可以避免对特殊情况的额外处理

1.不使用虚拟节点删除链表的逻辑过程

var removeElements = function(head, val) {// 删除头节点while (head !== null && head.val === val) {head = head.next;}// 删除非头节点let cur = head;while (cur !== null && cur.next !== null) {if (cur.next.val === val) {cur.next = cur.next.next;} else {cur = cur.next;}}return head;
};

代码解释

  1. 删除头节点:

    • 使用 while 循环检查头节点是否需要删除(即头节点的值等于 val)。
    • 如果需要删除,将头节点更新为下一个节点。
  2. 删除非头节点:

    • 使用另一个 while 循环遍历链表。
    • let cur = head; 这一步是为了在不改变头节点引用的前提下遍历和操作链表
    • 如果当前节点的下一个节点的值等于 val,则删除该节点。
  3. 返回头节点:

    • 在删除操作完成后,返回更新后的头节点。

回顾一下while和if的区别

whileif 是两种基本的控制结构,它们在编程中扮演不同的角色。理解这两者的区别对于编写有效的代码非常重要。

if 语句

  1. 用途if 语句用于基于特定条件执行一段代码。如果该条件为真(true),则执行 if 块内的代码;如果为假(false),则跳过该代码块。

  2. 一次性检查if 语句仅在条件首次评估时检查一次。不论条件之后如何变化,if 块内的代码只会基于最初的条件检查被执行或跳过。

while 循环

  1. 用途while 循环用于在条件为真时重复执行代码块。只要条件保持为真,循环就会继续进行。

  2. 重复检查:在 while 循环中,条件在每次循环开始时都会被检查。如果条件为真,循环体中的代码会被执行,然后再次检查条件;如果条件为假,循环将结束。

比较

  • 执行次数if 语句是单次执行的(只有当条件为真时),而 while 循环可以执行多次(只要条件保持为真)。
  • 用途if 语句用于条件性执行代码,while 循环用于重复执行代码,直到条件不再满足。

根据你的需求,你可以选择使用 if 来执行一次性的条件判断,或者使用 while 循环来执行重复的任务,直到满足某个停止条件。

2.使用虚拟节点删除链表的逻辑过程

2.1 虚拟节点

const ret = new ListNode(0, head);

2.2初始化节点

function ListNode(val, next) {this.val = val === undefined ? 0 : val;this.next = next === undefined ? null : next;
}

现在差不多理解了,但是不知道真是不是理解了

02------设计链表

1.虚拟节点

constructor() {this.dummyHead = new ListNode(0);this.size = 0;}

2.获取第n个节点的值

get(index) {// 1. 检查索引的有效性if (index < 0 || index >= this.size) return -1; // 如果索引小于0或大于等于链表的长度,索引无效,返回 -1。// 2. 遍历链表到达目标索引let current = this.dummyHead.next; // 从链表的第一个实际节点开始(跳过虚拟头节点)for (let i = 0; i < index; i++) {current = current.next; // 逐个节点向前移动,直到达到目标索引的节点}// 3. 返回找到的节点的值return current.val; // 返回目标节点的值
}

临时指针指向头部节点,不是虚拟节点

2头部插入节点

第n个节点前插入节点(在头部插入节点的情况)

3.添加节点、删除节点要知道前一个节点,所以指针是指向虚拟节点的

  • 添加节点
addAtIndex(index, val) {// 1. 检查索引的有效性if (index > this.size) return; // 如果索引大于链表的当前大小,插入操作是无效的,直接返回。// 2. 定位到要插入新节点位置的前一个节点let prev = this.dummyHead; // 从虚拟头节点开始for (let i = 0; i < index; i++) {prev = prev.next; // 移动到指定索引的前一个节点}// 3. 创建并插入新节点let newNode = new ListNode(val, prev.next); // 创建一个新节点,其 next 指向前一个节点的 nextprev.next = newNode; // 更新前一个节点的 next,使其指向新节点// 4. 更新链表大小this.size++; // 由于添加了一个新节点,链表的大小增加
}
  • 删除第n个节点(极端情况节点只有一个的时候)
deleteAtIndex(index) {// 1. 检查索引的有效性if (index < 0 || index >= this.size) return; // 如果索引小于0或大于等于链表的长度,操作无效,直接返回。// 2. 找到要删除节点的前一个节点let prev = this.dummyHead; // 从虚拟头节点开始for (let i = 0; i < index; i++) {prev = prev.next; // 移动到指定索引的前一个节点}// 3. 删除指定索引的节点prev.next = prev.next.next; // 将前一个节点的 next 指向要删除节点的下一个节点,从而跳过了要删除的节点// 4. 更新链表的大小this.size--; // 因为删除了一个节点,所以链表的长度减少
}
  • 要知道第n个节点的前面一个节点和后面一个节点

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用 

感想

心情很复杂,一个下午了居然就理解一道题

1.大概是要弄懂虚拟节点和指针的指向

2.目前的理解是,我们如果是需要添加或者删除节点,我们需要知道前一个节点是什么

3.我们需要找一个值,应该将我们现有的指针指向虚拟节点

4.读题比题目本身更加需要耐心,其实就是的要有耐心

5.长沙为什么那么冷啊,我的手啊好冷5555555~

 

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

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

相关文章

【C# 技术】 C# 常用排序方式——常规数据排序

C# 常用排序方式——常规数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&#…

C++ Qt开发:Charts折线图绑定事件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QCharts折线图的常用方法及灵活运用。 在上一…

华为OD机试 - 学生方阵 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出 四、解题思路1、题目解析2、解体思路 五、Java算法源码再重新读一遍题目&#xff0c;看看能否优化一下~ 六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导…

浏览器加粗字体显示异常

浏览器加粗的字体模糊虚化 如果在css中设置了普通的字体样式 font-face&#xff0c;使用了 font-weight: bold 的字体会在浏览器页面中会显示模糊虚化的现象&#xff0c;而正常的字体没有这种情况&#xff0c;显示的情况根据不同的浏览器会有区别。 * 出现轻微模糊虚化效果&am…

设计模式--桥接模式

实验9&#xff1a;桥接模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解桥接模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用桥接模式解决实际问题。 [实验任务]&#xff1a;两个维度的桥接模式 用桥接模式…

什么是OAuth2.0

前言 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方移动应用或分享他们数…

ssh远程执行命令卡住 使用vim、vi、cat等命令,或者在执行shell脚本时,都会莫名的卡住

最大传输单元 (MTU) 是网络层协议&#xff08;如 TCP&#xff09;支持的最大数据包的大小&#xff08;以字节为单位&#xff09;&#xff0c;标头和数据均包括在内。 通过IPsec隧道发送的网络数据包经过加密&#xff0c;然后封装在外部数据包中&#xff0c;以便进行路由。因为…

WiFi通信协议

一、引言 随着无线通信技术的飞速发展&#xff0c;WiFi协议已经成为现代生活中不可或缺的一部分。WiFi协议&#xff0c;全称为无线保真技术&#xff0c;是一种允许电子设备通过无线方式连接到互联网的技术标准。本文将深入探讨WiFi协议通信的工作原理、特点以及应用场景。 二、…

Netty组件基础

Netty入门简介 netty是一个异步、基于事件驱动的网络应用框架&#xff0c;用于快速开发可维护、高性能的网络服务器和客户端。 Netty优势 Netty解决了TCP传输问题&#xff0c;如黏包、半包问题&#xff0c;解决了epoll空轮询导致CPU100%的问题。并且Netty对API进行增强&#xf…

taro小程序指定@代表

1.ts.config.json "paths": {"/*": ["./src/*"] } config/index.js const path require(path) alias: {: path.resolve(__dirname, .., src) },

Codeforces Round 917 (Div. 2)(A~D)

A - Least Product Solution 观察发现&#xff0c;对于 a i < 0 a_i<0 ai​<0&#xff0c;操作后 a i a_i ai​ 不会变得更小&#xff0c; a i > 0 a_i>0 ai​>0&#xff0c;操作后 a i a_i ai​ 不会变得更大。所以&#xff0c;当 ∏ i 1 n a i ≥ 0…

Python如何将图片转换成字符

PIL(Python Image Library)库是Python平台上一个功能强大的图像处理标准库&#xff0c;支持图像的存储、显示和处理&#xff0c;几乎可以处理所有图片格式&#xff0c;如图像的压缩、裁剪、叠加、添加文字等等。 安装PIL库:pip install pillow from PIL import Image ascii_cha…

【期末复习】微信小程序复习大纲( 1- 5 章)

前言&#xff1a; 这周开始进入期末复习周&#xff0c;没时间看C/C、linux等知识了&#xff0c;先把期末考试必考的知识捋一遍。 目录 第一章 微信小程序入门 一、填空题 二、判断题 三、选择题 四、简答题 第二章 微信小程序页面制作 一、填空题 二、判…

【Java中创建对象的方式有哪些?】

✅Java中创建对象的方式有哪些&#xff1f; ✅使用New关键字✅使用反射机制✅使用clone方法✅使用反序列化✅使用方法句柄✅ 使用Unsafe分配内存 ✅使用New关键字 这是我们最常见的也是最简单的创建对象的方式&#xff0c;通过这种方式我们还可以调用任意的构造函数 (无参的和有…

mybatis的二级缓存使用以及禁用

目录 mybatis 二级缓存配置有两处 全局设置 mapper 设置 测试代码 执行结果 源码执行逻辑 创建 SqlSession 二级缓存配置是否添加 解析 cache 标签 XMLMapperBuilder MapperBuilderAssistant CacheBuilder PerpetualCache SerializedCache LoggingCache 将 cach…

Grafana二进制部署并配置prometheus数据源

1、获取grafna二进制安装包 https://grafana.com/grafana/download?pggraf&plcmtdeploy-box-1 grafana官网下载地址 [rootambari-hadoop1 ~]# cd /opt/module/grafana/ [rootambari-hadoop1 grafana]# pwd /opt/module/grafana2、在安装自己的安装目录执行 wget https:…

【C Primer Plus第六版 学习笔记】第十三章 文件输入/输出

有基础&#xff0c;进阶用&#xff0c;个人查漏补缺 文件&#xff1a;在磁盘或固态硬盘上的一段已命名的存储区。C把文件看作是一系列连续的字节所有文件的内容都以二进制形式&#xff08;0或1&#xff09;储存。 文本文件&#xff1a;文件最初使用二进制编码的字符表示文本&a…

在killercoda中的一次apiserver异常追查思路

笔者&#xff1a; 最近在准备cks考试&#xff0c; 然后又发现了killercoda这个能够提供模拟考试环境的平台。它提供了很棒的引导&#xff0c;教你一步步追查问题&#xff0c;形成一整套追查思路&#xff0c;我觉得很不错&#xff0c;特此分享。 准备工作 首先还是需要养成配置…

spark:RDD编程(Python版)

RDD运行原理 RDD设计背景 许多选代目前的MapReduce框架都是把中间结果写入到稳定存储 (比如磁盘)中带来了大量的数据复制、磁盘IO和序列化开销 RDD就是为了满足这种需求而出现的&#xff0c;它提供了一个抽象的数据架构&#xff0c;我们不必担心底层数据的分布式特性&#xf…

useRef语法讲解

useRef useRef 用法 import { useRef, useState } from react import ./App.cssfunction App() {const userRef useRef<HTMLInputElement>(null)const [val, setVal] useState()const handleClick () > {userRef.current?.focus()setVal(userRef.current?.valu…