首页 > 编程语言 >JavaScript实现数据结构 -- 链表

JavaScript实现数据结构 -- 链表

时间:2022-10-20 23:32:52浏览次数:59  
标签:p1 const -- JavaScript value next 链表 节点

链表

链表和数组一样是有多个元素组成的列表;

不同的是链表元素存储不连续,用next指针连接在一起; 图片来源于网络

链表的特点

  • 插入、删除不需要移动元素;
  • 不必事先分配存储空间;
  • 所需空间与长度成线性正比;
  • 不访问指定元素;

链表和数组的区别

数组:增删非首尾元素时,后面的元素需要移动。

链表:增删非首尾元素时,不需要移动元素,修改next指向即可。

JS模拟链表

虽然JavaScript中没有链表,但是我们可以用对象 来实现链表的功能。

// 用对象模拟链表
const a = { value: 'a' };
const b = { value: 'b' };
const c = { value: 'c' };
const d = { value: 'd' };
const e = { value: 'e' };
// 用next属性将对象连起来
a.next = b;
b.next = c;
c.next = d;
d.next = e;

在这里插入图片描述

遍历链表

// 定义指针p
let p = a;
while(p){
    console.log(p.value);
    p = p.next;
}

在这里插入图片描述

插入节点

将节点f 查到节点a 和 节点b之间;

	const f = { value: 'f' };
	//修改next指向
	a.next = f;
	f.next = b;

在这里插入图片描述

删除节点

修改next指向,删除节点f;

	a.next = b;

在这里插入图片描述

链表应用

删除链表中的节点(leetcode:237)

在这里插入图片描述

思路

将下一个节点的值赋值给当前节点;

删除下一个节点;

代码

	var deleteNode = function(node) {
	    // 将下一个节点值赋值给当前节点
	    node.val = node.next.val;
	    // 删除下一个节点
	    node.next = node.next.next;
	};

在这里插入图片描述

反转链表(leetcode:206)

在这里插入图片描述

思路

使用双指针一前一后遍历链表;

然后反转双指针;

代码

	var reverseList = function(head) {
	    // 定义双指针p1、p2 p1指向头节点,p2指向null(头节点前一个节点)
	    let p1 = head;
	    let p2 = null;
	    //p1指向null时遍历完链表
	    while(p1){
	        const t = p1.next;
	        // 反转链表
	        p1.next = p2;
	        // 遍历链表
	        p2 = p1;
	        p1 = t;
	    }
	    return p2;
	};

在这里插入图片描述

标签:p1,const,--,JavaScript,value,next,链表,节点
From: https://blog.51cto.com/u_15718546/5780807

相关文章

  • golang中的切片
    索引:https://waterflow.link/articles/1666277946416在go中切片的底层是数组,所以切片的数据连续存储在数组的数据结构中。如果底层的数组满了,切片还需要添加元素的话,底层数......
  • C语言多路开关模式的switch语句
    C语言多路开关模式的switch语句将switch语句中有的语句块的break删除掉。使多个语句块输出同一个。例子:输入一个月份,判断是几月份。#define_CRT_SECURE_NO_WARNINGS1#incl......
  • 【Oracle】准实时大规模数据提取
    文中使用的Oracle版本为10g。这篇文章是之前本人在前公司内部做可行性分析报告中的其中一个板块的内容,具体讲述的是为了做大规模数据提取和数据清洗做了一个试验demo。先说......
  • 博弈论专题3
    题目链接在这里:​​C-PalindromeGame(hardversion)_牛客竞赛博弈专题班组合游戏基本概念、对抗搜索、Bash游戏、Nim游戏习题(nowcoder.com)​​先占个坑,首先这不是经典......
  • 2022-在线查看安卓(android)系统源代码网站
    国内可直接访问:opersys(版本较丰富)[android1.6-android12]http://aosp.opersys.com/androidxref[android1.6-android9.0]http://androidxref.com/[andr......
  • golang中的切片
    索引:https://waterflow.link/articles/1666277946416在go中切片的底层是数组,所以切片的数据连续存储在数组的数据结构中。如果底层的数组满了,切片还需要添加元素的话,底层......
  • 小数点的精确方法
    小数点的精确方法1.直接用格式化输出String.format()doubleb=123.4;System.out.println(String.format("%.3f",b));//打印结果为123.400//这里精确到小数点后三位Sys......
  • ubunta学习(1)
    在Ubuntu上使用C的方法1)下载GCC编译器2)学习一些指令cd去往一个目录mkdir"文件名"创建一个文件名nano"filename.c"创建一个c的文件......漫长的编译ctrl+s保......
  • 线程池
    线程池概论线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池的好处降低资源的消耗提高响应速度方便管理总......
  • JVM、JDK、JRE你分的清吗
    JVM、JDK、JRE你分的清吗前言在我们学习Java的时候,就经常听到"需要安装JDK"、"运行需要JRE"、"JVM调优"等等,这里面的JVM、JDK、JRE你真的分得清吗,今天我们就来讲讲它们......