什么是链表?

news2024/9/29 5:32:30

链表

什么是链表?

链表是有序的数据结构,链表中的每个部分称为节点。可以首、尾、中间进行数据存取,链表的元素在内存中不必是连续的空间,每个节点通过 next 指针指向下一个节点。

在这里插入图片描述

优点

链表的添加和删除不会导致其余元素位移。

缺点

无法根据索引快速定位元素。

数组和链表区别

  • 获取、修改元素时,数组效率高
  • 添加、删除元素时,链表效率高
  • 数组添加、移除会导致后续元素位移,性能开销大

环形链表

指的是链表最后一个节点的 next 指向第一个节点,形成首尾相连的循环结构。

链表环路检测

解题思路

  1. 快慢指针法实现
  2. slow 指针每次移动一位,fast 指针每次移动两位,如果他们相遇则说明链表存在环
  3. 新指针 ptr 从 head 开始移动,与 slow 相遇的位置即为环的起点
  4. 由 fast 指针移动距离为 slow 的两倍可得出公式: a + (nb + nc + b) = 2(a + b)
  5. 变化处理后得到新公式: a = (n - 1)(b + c) + c
    在这里插入图片描述

实现功能

在 JavaScript 中没有链表,我们可以通过模拟一个类或者是通过 Object 实现链表的所有功能。

节点类

  • value 当前节点值
  • next 指向下一个节点

链表类

  • addAtTail 尾部添加节点
  • addAtHead 头部添加节点
  • addAtIndex () 指定位置添加节点
  • get 获取节点
  • removeAtIndex () 删除指定节点

应用场景

  • leetcode 两数相加

基础案例

通过对象实现

// 链表
let a = { val: 'a', next: null }
let b = { val: 'b', next: null }
let c = { val: 'c', next: null }
let d = { val: 'd', next: null }

a.next = b
b.next = c
c.next = d

// 尾部添加节点
let e = { val: 'e', next: null }
d.next = e

// 头部添加节点
let z = { val: 'z', next: null }
z.next = a
a = z

// 指定位置添加节点
let f = { val: 'f', next: null }
c.next = f
f.next = d

// 删除指定节点
d.next = null

通过类模拟实现

/**
 * 节点类
 */
class Node {
    constructor(value) {
        this.value = value
        this.next = null
    }
}

/**
 * 链表类
 */
class Link {
    constructor() {
        this.head = null
        this.count = 0
    }

    /**
     * 尾部添加节点
     */
    addAtTail(item) {
        if (this.count === 0) {
            this.head = new Node(item)

            this.count++

            return this.head
        }

        let endNode = this.head

        while (endNode.next) {
            endNode = endNode.next
        }

        endNode.next = new Node(item)

        this.count++

        return item
    }

    /**
     * 头部添加节点
     */
    addAtHead(item) {
        if (this.head) {
            const oldHead = this.head

            this.head = new Node(item)
            this.head.next = oldHead
        } else {
            this.head = new Node(item)
        }

        this.count++

        return item
    }

    /**
     * 指定位置添加节点
     */
    addAtIndex(index, item) {
        if (this.isInvalidIndex(index) || !this.head) {
            return -1
        }

        if (index === 0) {
            this.addAtHead(item)

            return item
        }

        let prev = this.head

        while (index > 0) {
            index--
        }

        const next = prev.next

        const cur = new Node(item)

        prev.next = cur
        cur.next = next

        this.count++

        return item
    }

    /**
     * 获取节点
     */
    get(index) {
        if (this.isInvalidIndex(index) || !this.head) {
            return -1
        }

        let cur = this.head

        while (index > 0) {
            cur = cur.next

            index--
        }

        return cur
    }

    /**
     * 删除指定节点
     */
    removeAtIndex(index) {
        if (this.isInvalidIndex(index) || !this.head) {
            return -1
        }

        if (index === 0) {
            const oldHead = this.head
            this.head = this.head.next

            this.count--

            return oldHead
        }

        let prev = this.head

        while (index - 1 > 0) {
            prev = prev.next

            index--
        }

        const cur = prev.next

        prev.next = cur.next

        this.count--

        return cur
    }

    /**
     * 判断index是否为空,是否超出数据长度大小
     */
    isInvalidIndex(index) {
        if (index === '' || index === null || index === undefined || index < 0 || index > this.count - 1) {
            return true
        }

        return false
    }
}

const link = new Link()

link.addAtTail('a')
link.addAtTail('b')
link.addAtTail('c')

原文链接:菜园前端

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

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

相关文章

java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?

java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗&#xff1f;如果能&#xff0c;如何实现&#xff1f; 答案2023-06-21&#xff1a; java的&#xff1a; 这个问题&#xff0c;我问了一些人&#xff0c;部分人是回答得有问题的。synchronized这是个关键字&…

23---WPF数据库ORM框架

一、仓库--存放货物---数据库--存放数据--关系型数据/非关系型数据库 1.关系型数据:保存数据保存关系--SqlServer&#xff0c;MySql&#xff0c;Oracle 2.非关系型数据&#xff1a;保存数据---Redis,Mongo,Memecahe 二、关系型数据和非关系型数据的区别&#xff1a; 1.关系…

高效底座模型LLaMA

论文标题&#xff1a;LLaMA: Open and Efficient Foundation Language Models 论文链接&#xff1a;https://arxiv.org/abs/2302.13971 论文来源&#xff1a;Meta AI 一、概述 大型语言模型&#xff08;Large Languages Models&#xff0c;LLMs&#xff09;通过大规模文本数据的…

Selenium 环境配置

如果你做过 Web 测试的工作&#xff0c;那么你应该明白 Web 测试中最重要的一部分工作就是自动化测试。自动化测试&#xff0c;顾名思义就是让浏览器自动运行&#xff0c;而无需手动操作。这和我们爬虫工作原理有些相似&#xff0c;我们爬虫也需要让浏览器运行网址来获取我们需…

HTTPS加密

目录 HTTPS加密1.加密和解密2.对称加密3.非对称加密4.中间人攻击5.证书 HTTPS加密 1.加密和解密 1.明文: 要传递的原始信息。 2.密文: 经过加密后的信息。 3.加密就是指将明文&#xff08;要传输的信息&#xff09;按照指定的方式进行变换&#xff0c;生成密文。 4.解密…

Pytest+selenium+allure+Jenkins自动化测试框架搭建及使用

一、 环境搭建 1. Python下载及安装 Python可应用于多平台包括windows, Linux 和 Mac OS X, 本文主要介绍windows环境下。你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。 如未安装python, 推荐下载python 3.8.3以…

Android——事务处理(续)(十三)

1. 长按事件 1.1 知识点 &#xff08;1&#xff09;掌握长按事件的操作形式&#xff1b; &#xff08;2&#xff09;可以设置手机的桌面背景&#xff1b; 1.2 具体内容 范例&#xff1a;长按一张图片之后&#xff0c;此图片设置为手机桌面背景。 <LinearLayout xmlns:a…

LocalDateTime 和 LocalDate 与 date 有什么区别;LocalDateTime 示例,LocalDate 示例

目录 1 LocalDateTime 和 LocalDate 与 date 有什么区别2 LocalDateTime 示例&#xff1a;2 LocalDate 示例&#xff1a; 1 LocalDateTime 和 LocalDate 与 date 有什么区别 LocalDateTime、LocalDate和Date是 Java中不同的类库中用于表示日期和时间的类&#xff0c; 它们在功…

「Java核心技术大会 2023」6月重磅启动,邀你共同探讨Java生态

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初…

《机器学习公式推导与代码实现》chapter13-LightGBM

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 LightGBM 就GBDT系列算法的性能而言&#xff0c;XGBoost已经非常高效了&#xff0c;但并非没有缺陷。LightGBM就是一种针对XGBoost缺陷的改进版…

【C++11】 列表初始化 auto 范围for 新增关键字 新增容器

文章目录 1 列表初始化2 auto && 范围for3 新增关键字3.1 decltype3.2 default3.3 delete3.4 final与override 4 总结 1 列表初始化 由c语言的规则我们知道&#xff1a;一般只有数组才会支持用{}初始化&#xff0c;但是C11新语法规定我们不仅可以用{}初始化各种对象(内…

企业微信 创建应用后如何构造网页授权 获取token 获取用户信息

第一次对接企业微信&#xff0c;上网找了各种方案。 目的是在企业微信中&#xff0c;公司发给员工一个地址&#xff0c;员工点开后打开画面&#xff0c;在这个画面上可以获取到这个员工的userid&#xff08;后续功能操作就是各自不同的功能了哈&#xff0c;就不详细说了&#…

STM32F4_触摸屏

目录 1. 触摸屏原理 2. 电阻式触摸屏检测原理 3. 电容式触摸屏检测原理 4. 硬件配置 4.1 XPT2046驱动芯片 4.2 硬件设计 5. 代码详解 5.1 main.c 5.2 AT24C02.c 5.3 AT24C02.h 5.4 C_Touch_I2C.c 5.5 C_Touch_I2C.h 5.6 Touch.c 5.7 Touch.h 5.8 FT5206.c 5.9 …

ADAudit Plus:保护企业内部IT安全的强大解决方案

随着企业数字化的推进&#xff0c;IT系统和数据安全变得比以往任何时候都更加重要。为了保护企业的机密信息和敏感数据&#xff0c;企业需要一种可靠的IT安全解决方案。在众多选项中&#xff0c;ADAudit Plus是一款备受赞誉的软件&#xff0c;为企业内部的IT安全提供了强大的支…

Python入门自学进阶-Web框架——36、Web微信类实现初步

打开页面&#xff0c;会出现一个二维码&#xff0c;要使用手机微信扫一扫&#xff0c;才能登录。它的实现原理是什么&#xff1f; 下图为打开网页版微信登录的调试工具网络信息&#xff0c;定时发送请求&#xff0c;状态待处理&#xff08;pending&#xff09; 上图的挂起是pe…

网络安全|渗透测试入门案例分析,从零基础入门到精通—登录框页面的快速渗透常用检测手段

目录 引言 1、弱口令 2、万能密码绕过 ​编辑 3、登录认证绕过 3.1.令牌刷新端的错误配置 3.2. 错误的sso配置 3.3.CMS个例的访问问题 3.4.JWT Token的错误解析 3.5.暴力修改Authentication 4、图形验证码不失效 5、短信验证码不失效 6、短信攻击 7、反射型跨站脚…

【MySQL数据库】MySQL 高级SQL 语句二

MySQL 高级 SQL 语句二 一、连接查询1.1 inner join&#xff08;内连接&#xff09;1.2 left join &#xff08;左连接&#xff09;1.3 right join(右连接) 二、CREATE VIEW ---- 视图三、 UNION - - 连集3.1 UNION3.2 UNION ALL 四、交集值&#xff08;取两个SQL语句结果的交集…

经典:商业智能BI解读,值得收藏

关注新闻的朋友们可能注意到了&#xff0c;最近这段时间关于数据要素、数字经济、数字化转型的相关行动越来越多&#xff0c;一方面是各级政府的政策规划以及大规模的发展行动&#xff0c;另一方面是则是各行各业的企业开始探寻数字经济&#xff0c;通过数字化转型进行改革&…

angular学习笔记

目录 1、认识Angular![在这里插入图片描述](https://img-blog.csdnimg.cn/17fe3ec067b64d75bf9d24a4e71403ed.png)2、路由2.1、路由懒加载2.2、路由守卫 3、模版指令4、生命周期4.1、父子生命周期 5、依赖注入6、RXJS7、自定义事件&#xff0c;自定义指令8、自定义管道9、获取d…

内网渗透(八十八)之委派攻击

委派 委派是大型网络中经常部署的应用模式,给多跳认证带来了很大的便利与此同时也带来了很大的安全隐患。利用委派,攻击者可结合其他漏洞进行组合攻击,导致攻击者可获取本地管理员权限甚至域管理员权限,还可以制作深度隐藏的后门。 委派是指将域内用户的权限委派给服务账…