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

2023-12-24 22:44

本文主要是介绍【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~

 

这篇关于【12.24】转行小白历险记-刷算法03的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/533382

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯: