javascript刷链表——链表基础知识、虚拟头节点操作链表及链表基本操作

news2025/1/21 12:22:17

javascript刷链表1

  • javascript刷链表1
    • 1.链表基础知识
    • 2.虚拟头节点操作链表
      • 力扣:203.移除链表元素
    • 3.链表基本操作
      • 力扣:707. 设计链表

javascript刷链表1

今天开始刷链表,冲冲冲~

1.链表基础知识

链表是一种通过指针串联在一起的一种线性结构,每个节点由两个部分组成,一个是数据域,一个是指针域(指向下一个节点),最后一个节点的指针域指向null(即空指针)。
如下所示:
在这里插入图片描述
链表主要有以下几种类型:

  • 单链表:上面的结构就是单链表
  • 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。双链表既可以向前查询也可以向后查询。
    在这里插入图片描述
  • 循环链表:从字面意思上可以看到,其实就是链表首尾相连;
    在这里插入图片描述
    链表和之前刷的数组不太一样,数组在内存中是连续分布的,但是链表在内存中不是连续分布的

2.虚拟头节点操作链表

链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点在进行删除操作,接下来看一看哪种方式更方便。

力扣:203.移除链表元素

在这里插入图片描述
虚拟头节点操作链表,其实就是设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。
比如下面这个例子:在链表中移除元素1
在这里插入图片描述
上面的题我理解的主要是以下步骤:

  1. 我目前的理解是listnode可以建立一个单链表(是一个内置函数,百度可知具体内部结构),ListNode(0, head)可以建立一个head为0,其余部分为head的一个单链表;
  2. 必须要新建一个变量去改变temp内容,临时变量可以改变初始内容,因为处在同一个内存。步骤不难理解,因为将head设定为0,所以不用考虑head的特殊情况;
  3. 如果下一个地址的data===val,那么就将下一个地址赋值为下下个地址,跳过与val相同data的地址。如果不等于,则后移下一位地址进行片段;
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} val
 * @return {ListNode}
 */
var removeElements = function(head, val) {
    const temp=new ListNode(0,head);
    let cur=temp;
    while(cur.next){
        if(cur.next.val==val){
            cur.next=cur.next.next;
            continue;
        }
        cur=cur.next;
    }
    return temp.next;
};

3.链表基本操作

力扣:707. 设计链表

在这里插入图片描述
这个题好难,暂时先死记硬背把

var MyLinkedList = function() {
    this.size=0;
    this.dummyHead=new ListNode(0);
};

/** 
 * @param {number} index
 * @return {number}
 */
MyLinkedList.prototype.get = function(index) {
    if(index<0||index>=this.size){return -1;}
    //定义当前节点
    let cur=this.dummyHead;
    while(index>=0){
       cur=cur.next;
       index--;
    }
    return cur.val;
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function(val) {
    this.addAtIndex(0, val);
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function(val) {
    this.addAtIndex(this.size, val);
};

/** 
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function(index, val) {
     if(index>this.size){return;}
     if(index<0){index=0;}
     let cur=this.dummyHead;
     while(index>0){
        //更新当前节点位置,找到前驱节点
        cur = cur.next;
        //更新index
        index--;
     }
       //创建节点
    let node = new ListNode(val);
    //调整节点指向
    let tem = cur.next;
    cur.next = node;
    node.next = tem;
    //更新链表中节点的个数
    this.size++;
};

/** 
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function(index) {
    //边界条件判断
    if (index < 0 || index >= this.size) {
        return
    }
    //定义当前节点
    let cur = this.dummyHead;
    while (index > 0) {
        //更新当前节点位置,获取前驱节点
        cur = cur.next;
        //更新index
        index--;
    }
    //调整前驱节点的指针
    cur.next = cur.next.next;
    //更新链表中节点的个数
    this.size--;
};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * var obj = new MyLinkedList()
 * var param_1 = obj.get(index)
 * obj.addAtHead(val)
 * obj.addAtTail(val)
 * obj.addAtIndex(index,val)
 * obj.deleteAtIndex(index)
 */

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

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

相关文章

STM32之中断和事件

中断和事件什么是中断当CPU正在执行程序时&#xff0c;由于发生了某种事件&#xff0c;要求CPU暂时中断当前的程序执行&#xff0c;转而去处理这个随机事件&#xff0c;处理完以后&#xff0c;再回到原来被中断的地方&#xff0c;继续原来的程序执行&#xff0c;这样的过程称为…

TDengine创建database报错 DB error: Out of dnodes (0.000000s)

TDengine 创建数据库报错 CREATE DATABASE power KEEP 365 DURATION 10 BUFFER 16 WAL_LEVEL 1; DB error: Out of dnodes (0.000000s)这个错误提示表明 TDengine 的数据节点已经用完&#xff0c;无法继续创建新的数据库。这可能是由于您的 TDengine 数据库中已经存在了大量的…

阶段十:总结专题(第五章:数据库篇)

阶段十&#xff1a;总结专题&#xff08;第五章&#xff1a;数据库篇 &#xff09;Day-第五章&#xff1a;数据库篇1. 隔离级别1.1、**未提交读**&#xff08;不使用&#xff09;1.2、**提交读&#xff08;RC&#xff09;**&#xff08;经常使用&#xff09;1.3、**可重复读&am…

RDO一体化部署OpenStack

RDO一体化部署OpenStack 环境准备 安装centos7 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J785hZvT-1677578418769)(C:\Users\HONOR\AppData\Roaming\Typora\typora-user-images\image-20230228171254675.png)] 使用vmware安装安装centos7&a…

【Django功能开发】如何正确使用定时任务(启动、停止)

系列文章目录 【Django开发入门】ORM的增删改查和批量操作 【Django功能开发】编写自定义manage命令 文章目录系列文章目录前言一、django定时任务二、django-apscheduler基本使用1.安装django-apscheduler2.配置settings.py的INSTALLED_APPS3.通过命令生成定时记录表3.如何创…

MySQL索引类型(type)分析

type索引类型 system > const > eq_ref > ref > range > index > all 优化级别从左往右递减&#xff0c;没有索引的⼀般为’all’。推荐优化目标&#xff1a;至少要达到 range 级别&#xff0c; 要求是 ref 级别&#xff0c; 如果可以是 const 最好&#xff…

线程池源码和CompletableFuture使用总结

线程池 线程池的创建方式 通过Executors的静态方法通过 new ThreadPoolExecutor方式创建 七大参数的作用 参数作用corePoolSize核心线程数&#xff0c;线程池创建好后就准备就绪的线程数量&#xff0c;一直存在maximumPoolSize最大线程数量&#xff0c;控制资源keepAliveTim…

嵌入式 linux 系统开发网络的设置

目录 一、前言 二、linux网络静态地址设置 前言 为什么要对linux系统下的ubuntu进行网络设置呢&#xff1f; 因为我们在嵌入式开发中&#xff0c;我们要保证windows系统、linux系统、开发板的ip要处于同一个网段&#xff0c;而默认ubuntu下的linux系统的ip是动态分配的&#…

ACM-蓝桥杯训练第一周

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石.CSDN &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;ACM周训练题目合集.CSDN &#x1f4ac;总结&#xff1a…

debian 部署nginx https

我是flask 处理请求单进程&#xff0c; 差点意思 &#xff0c; 考虑先flask 在往下走 一&#xff1a;安装nginx 因为我是debian 系统&#xff0c;所以我的建议是直接 sudo apt-get install nginx 你也可以选择在官网下载&#xff0c; 但是我搭建ssl 的时候安装openssl非常的麻…

记住这3点,有效提高江苏专转本上岸率

记住这3点&#xff0c;有效提高上岸率 我们都知道&#xff0c;在江苏统招专转本考试中想岸并不是一件容易的事情。考生能否顺利上岸&#xff0c;往往受多方面因素影响&#xff0c;这其中包括&#xff1a;个人基础、学习方式、信息搜索能力。 如何提高自己的专转本上岸几率&…

粗心小编被云拯救,那云上数据谁来拯救?

开工第三天      小编已忙的焦头烂额      不是因为工作积压      而是因为自己的疏忽      也许是没有进入工作状态,一大早先经历了自行车钥匙丢失,手机遗落在家,好不容易坐到工位上才发现,备份数据的U盘忘带了。    不过,好在提前将工作文件上传到了云端…

10 大项目管理知识领域 4大核心领域 5大辅助领域

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 项目管理的10大知识领域&a…

LeetCode 1145. 二叉树着色游戏 -- 简单搜索

二叉树着色游戏 提示 中等 199 相关企业 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中&#xff0c;给出二叉树的根节点 root&#xff0c;树上总共有 n 个节点&#xff0c;且 n 为奇数&#xff0c;其中每个节点上的值从 1 到 n 各不相同。 最开始时&#xff1a; 「一…

【C++】vector的基本使用

难道向上攀爬的那条路&#xff0c;不是比站在顶峰更让人热血沸腾吗&#xff1f; 文章目录一、vector和string的联系与不同二、vector的扩容操作1.resize() &#xff08;缺省值为匿名对象&#xff09;&& reserve()2.reserve在g和vs上的扩容机制3.reserve异地扩容和shri…

Pinia 介绍、使用、实践

1. Pinia 介绍1.1 Pinia 是什么Pinia 官网https://pinia.vuejs.org/vuex Githubhttps://github.com/vuejs/vuex上面是 Vuex Github 中置顶说明&#xff0c;我们可以得知&#xff1a;Pinia 现在是新的默认设置&#xff0c;Vue 的官方状态管理库已更改为 Pinia&#xff0c;Vue3、…

数据结构与算法系列之时间与空间复杂度

这里写目录标题算法的复杂度大O的渐进表示法实例分析空间复杂度每日一题算法的复杂度 衡量一个算法的好坏&#xff0c;一般 是从时间和空间两个维度来衡量的&#xff0c; 即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢&#xff0c; 空间复杂度主要衡量一个…

Linux -- 程序 进程 线程 概念引入

程序与进程 &#xff1a;程序 &#xff1a;什么是程序 &#xff1f;&#xff1f;&#xff1f;伪官方 &#xff1a; 二进制文件&#xff0c;文件存储在磁盘中&#xff0c;例如 /usr/bin 目录下 。 是静态。 简单讲 &#xff1a;# 我们都学习了语言&#xff0c;比如下面这串代…

全国领先——液力悬浮仿生型人工心脏上市后在同济医院成功植入

2023年2月22日&#xff0c;华中科技大学同济医学院附属同济医院&#xff08;同济医院&#xff09;心脏大血管外科团队举办了一场气氛热烈的小规模庆祝活动&#xff0c;魏翔主任、程才副主任、王星宇副主任医师和李师亮医师到场&#xff0c;为终末期心衰患者黄先生“庆生”&…

Java 文本检索神器 “正则表达式”

Java 文本检索神器 “正则表达式” 每博一文案 在我们短促而又漫长的一生中&#xff0c;我们在苦苦地寻找人生的幸福&#xff0c;可幸福往往又与我们失之交臂&#xff0c; 当我们为此而耗尽宝贵的。青春年华&#xff0c;皱纹也悄悄地爬上了眼角的时候&#xff0c;我们或许才能…