介绍链表

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

很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难。只能说在部分变成语言中会有这种情况,在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. 在windows端使用jupyter notebook,服务器充当后台计算云端 简化描述

    在CentOS7服务器端启动jupyter notebook服务,在windows端使用jupyter notebook,服务器充当后台计算云端 简化描述 CentOS7服务器端 jupyter no ...

  2. YOCVM

    一.热补丁的本质 对于线上紧急的bug,重新提审AppStore的时间过长.因此,能够下发一段补丁代码到线上运行,并结合Runtime,实时改变App原有的行为,就显得极为重要.补丁代码的形式可以有很 ...

  3. ping + traceroute + tracert + tcpdump等命令的原理

    1.ping:关键就在这里,IP层协议通过机器B的IP地址和自己的子网掩码,发现它跟自己属同一网络,就直接在本网络内查找这台机器的. MAC如果以前两机有过通信,在 A 机的 ARP 缓存表应该 有 ...

  4. SkylineGlobe 如何二次开发实现天际线分析功能

    天际线效果: 示例代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <h ...

  5. awk 内置函数列表

    1.gsub要在整个记录中替换一个字符串为另一个,使用正则表达式格式,/目标模式/,替换模式/.例如改变学生序号4842到4899:$ awk 'gsub('4842/, 4899) {print $ ...

  6. 解决 java.net.BindException: Address already in use (Bind failed)

    这是因为tomcat未正确关闭导致的端口占用问题 找到报错中被占用的端口kill掉进程即可,一般是8080,也有下面这种8005的 11-Mar-2019 14:46:12.405 SEVERE [m ...

  7. ngx_lua 模块

    ngx_lua模块的原理: 1.每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM:2.将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问:3.每个 ...

  8. python中使用pymongo操作mongo

    MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档.数组及文档数组,非常灵活.在这一节中,我们就来看 ...

  9. LESS SCSS 预编译语言

      前  言 JRedu LESS  是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展. LESS 为 Web 开发者带来了福音,它在 ...

  10. 熟记这些git命令,你就是大神

    1.git log  查看 提交历史 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面 2.git log -p -2 常用 -p 选项展开显示每次提交的内容差异 ...