第5章 数据结构之“链表”

news2024/11/22 23:02:08

链表简介

1.多个元素组成的列表。
2.元素的存储不连续,用next指针连在一起。

数组 vs 列表

  1. 数组:增删非手尾元素时往往需要移动元素。如果要在数组中增加一个元素,数组后面的所有元素需要往后面移动一位。如果在数组中删除一个元素,后面的元素都要往前移动一位。
  2. 链表:增删非首尾元素,不需要移动元素,只需要更改next指针。
  3. javascript中是没有链表数据结构,但是可以使用Object模拟一个链表。

模拟链表数据结构(其实就是一个嵌套的Object)

const a = {value: 'a'}
const b = {value: 'b'}
const c = {value: 'c'}
const d = {value: 'd'}

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

链表的操作:

// 构建链表
const a = {value: 'a'}
const b = {value: 'b'}
const c = {value: 'c'}
const d = {value: 'd'}

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


// 遍历链表
// 声明一个指针p(point),然后在循环里面更改p=p.next,然后在这个位置就可以访问链表里面的元素了。
let p = a
while(p) {
	console.log(p.value)
	p = p.next
}

// 插入(在c,d中间插入一个e元素):
const e = { value: 'e' }
c.next = e
e.next = d


// 删除e(改变next指针)
c.next = d

leetCode: 237.删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。

请添加图片描述

var deleteNode = function (node) {
	// 将被删除节点的值改为下一个节点的值。
	node.value = node.next.val
	
	// 删除下个节点。
	node.next = node.next.next
}

时间复杂度:O(1)
空间复杂度:O(1)

leetCode:206.反转链表

反转一个单链表。

请添加图片描述
请添加图片描述

什么双指针遍历链表?一个指针指向2,一个指向1,,下一次,指向2的指向3,指向1的指向2

var reverseList = function (head) {
	// p1指向头部,p2指向null
	let p1 = head;
	let p2 = null;
	
	while(p1) {
		console.log(p1.val, p2 && p2.val)
		// 临时保存p1, 
		const temp = p1.next
		p1.next = p2

		p2 = p1
		p1 = temp
	}
	return p2
}

时间复杂度:O(n)
空间复杂度:O(1)(因为循环过程中只有单个值,既不是数组,也不是矩阵)

leetCode: 2.两数相加?

题目:

请添加图片描述

var addTwoNumbers = function (l1, l2) {
	const l3 = new ListNode(0)
	let p1 = l1;
	let p2 = l2;
	let p3 = l3;
	let carry = 0
	while(p1 || p2) {
		const v1 = p1 ? p1.val : 0;
		const v2 = p2 ? p2.val : 0
		const val = v1 + v2 + carry
		carry = Math.floor(val / 10)
		p3.next = new ListNode(val % 10)
		if (p1) p1 = p1.next
		if (p2) p2 = p2.next
		p3 = p3.next
	}
	if (carry) {
		p3.next = new ListNode(carry)
	}
	return l3.next
}

时间复杂度: O(n),n是两个链表的较大者,
空间复杂度: O(n),没有数组,矩阵,但是存在链表,所以也是O(n),n是两个链表的较大者,

leetCode: 83.删除有序链表中重复的元素

请添加图片描述

请添加图片描述


const deleteNode = function (head) {
	let p = head;
	while(p && p.next) {
		if(p.val === p.next.val) {
			p.next = p.next.next
		} else {
			p = p.next
		}
	}
	return head
}

leetCode: 141.环形链表

如何判断链表有环?
请添加图片描述
请添加图片描述

var hasCycle = function (head) {
	let p1 = head;
	let p2 = head;
	while(p1 && p2 && p2.next) {
		p1 = p1.next
		p2 = p2.next.next
		if (p1 === p2) {
			return true
		}
	}
	return false
}

js中的原型链

  1. 原型链本质上是一个链表
  2. 原型链上的节点是各种原型对象,例如:Function.prototype, Object.prototype, …
  3. 原型链通过__proto__属性连接各种原型对象。

原型链长什么样?

obj --> Object.prototype --> null

func --> Function.prototype --> Object.prototype --> null

arr --> Array.prototype --> Object.prototype --> null

num --> Number.prototype --> Object.prototype --> null

str --> String.prototype --> Object.prototype --> null

func:代表函数实例
obj:代码对象实例
arr: 代码数组实例
num: 代码数字实例
str: 代码字符串实例

// 查看下面的原型链长什么样?
const obj = {}
obj.__proto__== Object.prototype
obj.__proto__: Object.prototype --> null

const func = () => {}
obj.__proto__ ==  Function.prototype
obj.__proto__: Function.prototype --> Object.prototype --> null


const arr = []
obj.__proto__ = Array.prototype
obj.__proto__ : Array.prototype --> Object.prototype --> null

原型链知识点:

  1. 如果A沿着原型链能找到B.prototype,那么A instanceof B 为true。
  2. 如果在A对象上没有找到x属性,那么就会沿着A的原型链找x属性。
  3. 简述instanceof的原理:遍历A的原型链,如果找到B.prototype,返回true,否则返回false
const instaceof = function (A, B) {
	var p = A;
	// 遍历原型链
	while(p) {
		if (p === B.prototype) {
			return true
		}
		p = p.__proto__
	}
	return false
}

请添加图片描述
value a
undefined
value a
value b

var foo = {}
var F = function () {};
Object.prototype.a = 'value a'
Function.prototype.a = 'value a'
console.log(foo.a)
console.log(foo.b)
console.log(F.a)
console.log(F.b)

使用链表指针获取json的节点值

const json ={
	a: {b: {c: 1}},
	d: {e: 2},
}
// 求根据path组成的路径的惊悚的值。
const path = ['a', 'b', 'c']

// 解答:
let p = json
path.forEach((k) => {
	p = p[k]
})
console.log('p', p) // 1

总结

1.链表元素的存储不连续,用next指针连在一起。
2.javascript中是没有链表数据结构,但是可以使用Object模拟一个链表。
3.链表的常用操作:修改next,遍历链表。

技术要点:
1.js中的原型链也是一个链表,他是根据prototype指针走的。
2.使用链表指针可以获取json的节点值。

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

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

相关文章

Hive ---- Hive 安装

Hive ---- Hive 安装 1. Hive安装地址2. Hive安装部署1. 安装Hive2. 启动并使用Hive 3. MySQL安装1. 安装MySQL2. 配置MySQL3. 卸载MySQL说明 4. 配置Hive元数据存储到MySQL1. 配置元数据到MySQL2. 验证元数据是否配置成功3. 查看MySQL中的元数据 5. Hive服务部署1. hiveserver…

旧版VS安装 Visual Studio 2019/2017/2015官方安装教程

安装VisualStudio找不到官方版本?只能找到第三方?害怕中毒? 不要急,本文例举了VS 2019 2017 2015的官方位置,不用但心装成第三方Visual Studio 百度搜索 Visual Studio 2017,只有第三方的包,而…

HBase(2):HBase数据模型

1 简介 在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。 表结构如下: ROWKEY C1列蔟 C2列蔟 rowkey 列1 列2 列3 列4 列4 列6 列簇结构如下&#xff1a…

学系统集成项目管理工程师(中项)系列13a_人力资源管理(上)

1. 基本情况 1.1. 项目团队成员的特征 1.1.1. 高学历、高素质、流动性强、年轻、个性独立 1.2. IT行业的显著特征 1.2.1. 工作强度大 1.3. 绩效评定、招聘、留用、劳工关系、健康与安全规定及其他与管理人力资源有关的技能 1.4. 项目团队成员是项目的人力资源 1.5. 项目…

后端要一次性返回我10万条数据

问题描述 面试官:后端一次性返回10万条数据给你,你如何处理?我:歪嘴一笑,what the f**k! 问题考察点 看似无厘头的问题,实际上考查候选人知识的广度和深度,虽然在工作中这种情况很少遇到... …

【unity项目实战】3DRPG游戏开发06——敌人和攻击

导入敌人素材 RPG Monster Duo PBR Polyart 拖入敌人,如果觉得他的亮度有点低,选择他本体,可以选择调节修改他材质球metllic alpha的值 我们新建一个敌人脚本,我们的所有敌人都会挂载这个脚本,如果我们希望每个敌人都挂载导航组件,一个添加无疑是很麻烦的,我们可以使…

基于ESP32的zigbee温湿度采集系统

一. 系统设计及框图: 本设计可以实现通过ZIGBEE传输温湿度信息和开关量信号到云端然后再通过手机APP显示。系统分为发射端和接收端,发送端采集温湿度信息后通过ZIGBEE发送到接收端,接收端接收到温湿度信息后上传到云端并通过手机APP显示。 …

import _jpype ImportError: DLL load failed: 找不到指定的模块

问题记录及解决思路 (1)问题记录 当python3需要调用java程序的需求时,需要使用到jpype这个库,尝试通过pip install jpype 进行安装,结果提示没有这个库,看网上教程提示pip install jpype1进行安装还是有问…

游戏测试的整个流程是什么

在游戏行业中,游戏测试是一个非常重要的岗位,并且游戏测试的内容是比较复杂的,除了对游戏的整体流程有一定的了解之外,还需要对一些细节部分有所了解。那么,一个完整的游戏测试流程是怎么样的呢? 游戏测试其实并不是一…

扎克伯格:同时专注AI和Metaverse,Quest 3将是下一个里程碑

自更名以来,Meta大张旗鼓的重磅投入元宇宙面临了一系列风波,市场经济不景气,广告利润下降,大幅裁员、重组等。 23年1季度Meta实现营收增长,好于预期,而此前三个季度同比都是下跌,可见“效率年”…

【AI实战】微小目标检测模型SSPNet--训练环境从零开始搭建

【AI实战】微小目标检测模型SSPNet--训练环境从零开始搭建 SSPNet介绍环境搭建安装依赖参考 SSPNet介绍 SSPNet: Scale Selection Pyramid Network for Tiny Person Detection from UAV Images 官方连接 https://github.com/MingboHong/SSPNetarxiv https://arxiv.org/abs/210…

ValueError: Please specify `target_modules` in `peft_config`解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

hive进阶——在centos7里面配置mysql,将原来hive的客户端扩展

系列文章目录 centos集群上安装hive客户端的操作步骤以及hive介绍 文章目录 一、启动hive客户端 二、在Hive上面安装MySQL 2.1、MySQL安装 1 检查当前系统是否安装过 MySQL 2 将 MySQL安装包拷贝到 /opt/software目录下 3 解压 MySQL安装包 ​4 在安装目录下执行 rpm …

泰迪杯|第十一届“泰迪杯”挑战赛作品提交仅剩2天了!

提交作品截止时间: 2023年4月28日 16:00:00 距离第十一届“泰迪杯”数据挖掘挑战赛提交作品结束时间只剩2天了,相信大家都在做着最后的更改。小编为大家整理了一些提交的步骤及注意事项,记得一定要调好闹钟,不要错过提交时间哦。 01 在作…

【Cpp】前K个高频单词-排序的稳定性

文章目录 题目思路1--使用sort排序并优化其稳定性方法一:方法二 思路2--multiset 题目 https://leetcode.cn/problems/top-k-frequent-words/description/ 思路1–使用sort排序并优化其稳定性 我们可以直接先将每个单词出现的次数用一个CountMap统计出来,然后放入一个vecto…

超级详细的华为OSPF实验及配置

什么是OSPF? 开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。 目前针对IPv4协议使用的是OSPF Version 2(RFC2328&#x…

【Linux】8、查看 Linux 主机运行状态、压缩和解压缩命令、Linux 的环境变量

目录 一、查看 Linux 系统资源占用二、硬盘信息监控三、网络监控命令四、Linux 文件上传和下载命令五、压缩和解压(1) 压缩格式(2) tar 命令 六、Linux 的环境变量 一、查看 Linux 系统资源占用 ✒️ 可通过 top 命令查看系统的 CPU、内存的使用情况(类似 Windows …

超详细Redis入门教程——Redis 持久化

前言 本文小新为大家带来 超详细Redis入门教程——Redis 持久化 相关知识,具体内容包括持久化基本原理,RDB 持久化(包括:持久化的执行,RDB 优化配置,RDB 文件结构,RDB 持久化过程)&a…

台灯护眼灯哪个牌子好用?真正适合学生使用的护眼台灯

最近家里一款陪伴了多年的灯泡的台灯因为年久失修已经损坏了,导致不得不换个台灯,而换台灯就不得不仔细挑选,毕竟是需要长期使用的,对视力方面影响还是很大的,通常老式台灯的光照明显对视力都产生不了太大保护&#xf…

AI可以实现陪伴需求吗

在现代社会,科技日新月异,个性化AI定制服务已经成为一种新型的科技应用,被越来越多的人所接受和使用。个性化AI定制是一种基于人工智能技术的个性化服务,它可以帮助我们更好地规划生活,为我们提供情感上的陪伴和生活上…