介绍链表

链表是由一组节点组成的集合。每一个节点都使用一个对象的引用指向它的后续借点。指向另外一个借点的引用叫做链。

很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难。只能说在部分变成语言中会有这种情况,在javascript中和php中数组的长度是可以任意增加的。在数组中添加和删除元素也是比较麻烦,因为要将数组中其他元素向前或者向后平移,这个在javascript中也不是问题,javascript中有一个很方便的方法splice()方法很方便的就可以添加或删除元素。

但是凡是都是相对的,javascript中的数组也有自己的问题,他们被设计成了对象,与其他语言(比如c++和java)相比它的效率很低。

如果在实际的使用中发现数组的效率很慢,就可以考虑使用链表来代替。数组还有个优势是可以根据键值很方便的访问数组的值,除此之外,链表在任何场合都可以代替数组。如果需要随机地访问元素,数组仍然是更好的选择。

代码实现

定义链表节点(Node)类

Node类包含两个属性,element用来保存节点上的数据,next用来保存指向下一个节点的链接

class Node {
constructor(element) {
this.element = element; // 表示节点上的数据
this.next = null; // 表示指向下一个节点的链接
}
}
export default Node;

定义链表类(LinkedList)类

LinkedList类提供插入节点,删除节点,显示链表节点元素的方法,以及一些其他的辅助方法

import Node from './Node';
/**
* Linked List class
*/
class LinkedList {
/**
* 构造器,初始化头节点
*/
constructor() {
this.head = new Node('head'); // 节点头列表
} /**
* 根据指定值找出当前节点
* 辅助方法
* @param {*} item
*/
_find(item) {
let currNode = this.head;
while(currNode.element != item) {
currNode = currNode.next;
}
return currNode;
} /**
* 把新的节点插入到指定节点的后面
* @param {*} newELement 插入的新节点
* @param {*} item 插入元素的前一个节点值
*/
insert(newELement, item) {
let newNode = new Node(newELement);
let currNode = this._find(item);
newNode.next = currNode.next;
currNode.next = newNode;
} /**
* 移除节点
* @param {*} item
*/
remove(item) {
// 找出指定节点的前一个节点
let prevNode = this.head;
while(prevNode.next != null && prevNode.next.element != item) {
prevNode = prevNode.next;
} if (prevNode.next != null) {
// 设置前一个节点next指向当前节点的next
prevNode.next = prevNode.next.next;
}
} /**
* 显示所有节点数据
*/
display() {
let currNode = this.head;
while(currNode.next != null) {
console.log(currNode.next.element);
currNode = currNode.next;
}
}
} export default LinkedList;

测试

import LinkedList from './LinkedList';

// 创建一个 LinkedList 实例
let ll = new LinkedList(); // 插入一些元素
ll.insert('zhangsan', 'head');
ll.insert('lisi', 'zhangsan');
ll.insert('wangwu', 'lisi'); ll.display(); // 显示元素,控制台输出 zhangsan,lisi,wangwu
ll.remove('lisi');
ll.display(); // 控制台输出 zhangsan,wangwu

js 单项链表的更多相关文章

  1. c++刷题(27/100)反转单项链表,链表的倒数第k个

    题目1:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位 ...

  2. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  3. js 实现链表

    我们通常会在c++这类语言中学习到链表的概念,但是在js中由于我们可以动态的扩充数组,加之有丰富的原生api.我们通常并不需要实现链表结构.由于突发奇想,我打算用js实现一下: 首先我们要创建链表: ...

  4. js创建链表

    首先要明确,我们为什么要创建链表呢?数组的大小是固定的,从数组的起点或中间插入或移除的成本很高,因为需要移动元素.尽管JS的Array类方法可以做这些,但是情况也是这样.链表存储有序的元素集合,但不同 ...

  5. js数据结构-链表

    链表和数组 大家都用过js中的数组,数组其实是一种线性表的顺序存储结构,它的特点是用一组地址连续的存储单元依次存储数据元素.而它的缺点也正是其特点而造成,比如对数组做删除或者插入的时候,可能需要移动大 ...

  6. 数据结构和算法 c#– 1.单项链表

    1.顺序存储结构 Array 1.引用类型(托管堆) 2.初始化时会设置默认值   2.链式存储结构 2.1.单向链表 2.2.循环链表 2.3.双向链表

  7. js模拟链表

    链表: 每个元素,都有一个指针,指向下一个元素 //链表 function LinkedList(){ var head = null; length = 0; this.append = funct ...

  8. c++ 创建单项链表

    建立单向链表 头指针Head 插入结点 //建立头结点 Head Head=p= malloc(sizeof( struct stu_data)); // memset(stu,,sizeof( st ...

  9. [LeetCode] Rotate List 单项链表旋转

    Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...

随机推荐

  1. 获取键盘的ascii码

    waitKey(1) & 0xFF获取当前按的键的ascii码,

  2. Luogu3676 小清新数据结构题 动态点分治

    传送门 换根类型的统计问题动态点分治都是很好做的. 设所有点的点权和为$sum$ 首先,我们先不考虑求$\sum\limits_i s_i^2$,先考虑如何在换根的情况下求$\sum\limits_i ...

  3. C#的delegate简单练习

    delegate中文的意思为委托. 在很久之前,Insus.NET有写过一篇<用一个简单的例子来演绎事件委托>http://www.cnblogs.com/insus/p/3732075. ...

  4. DeskMini无传统机械键盘与鼠标接口的情况下使用U盘安装系统经验总结

    总结安装纯净版Win7旗舰版系统安装过程所解决的问题要点: 1:UEFI引导启动的实现. 2:使用Dism++实现系统的安装. 3:使用Dism++解决新主板在安装系统过程中不能使用USB键盘和鼠标的 ...

  5. odoo11 外部数据导入方法2

    前面有一篇文章分析了如何使用2个分开的文件分别将外部数据导入到odoo对应的系统当中,如之前所说,是存在缺点的,现在测试将所有数据放入一个文件中将主表与从表的数据一次性导入,这样可以很方便的利用odo ...

  6. DefWindowProc是一个会产生消息的函数

    先看一道题目: 当用户点击右上角关闭按钮的时候,请给下列Windows做出的响应排个序:A:发送 WM_QUIT 消息     B:发送 WM_CLOSE 消息     C:发送 WM_DESTROY ...

  7. Linux性能评测工具之一:gprof篇

    这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并把相关的资料作一个汇总,以便以后信手拈来! 1 简介 改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数 ...

  8. Vue中axios访问 后端跨域问题

    public class AllowOriginFilter implements Filter { @SuppressWarnings("unused") public void ...

  9. 解决Jira和Confluence访问打开越来越缓慢问题

    Jira和Confluence部署在同一台服务器上,跑一段时间后,发现访问jira和confluence时,打开越来越缓慢.这是因为根据主机物理内存不同,默认的java虚拟机内存也会不同(一个较低值) ...

  10. 解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file

    原文地址:http://blog.csdn.net/yjk13703623757/article/details/53217377 一.问题 运行hydra时,提示错误: hydra : error ...