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

首先我们要创建链表:

 //创建链表
function CreateLinkNode(data, pre, next){
this.data = data;
this.preNode = pre;
if(this.preNode){
pre.nextNode = this;
}
this.nextNode = next;
}

链表最基本的要包括数据部分(data)、指向前一个的指针(preNode)、指向后一个的指针(nextNode)。

为了便于观察结果,我们再写一个打印链表的函数,挂在原型上:

 //从模一个节点开始打印链表
CreateLinkNode.prototype.print = function(){ if(this.nextNode){
return this.data.name + this.nextNode.print();
}else{
return this.data.name;
}
}

打印的函数由某一个节点调用,递归调用,拼装从此之后的所有节点的数据部分。

增删改查都要有吧:

 //从某一个节点的后面开始插入一个节点
CreateLinkNode.prototype.insertNode = function(node){
if(this.nextNode && this.nextNode.preNode){
this.nextNode.preNode = node;
} node.nextNode = this.nextNode; node.preNode = this;
this.nextNode = node;
} //删除某一个节点
CreateLinkNode.prototype.removeNode = function(){
this.nextNode.preNode = this.preNode;
this.preNode.nextNode = this.nextNode;
}

插入节点: 在当前的节点后面插入一个节点对象。注意一下,如果当前节点是尾节点时的单独处理。

删除节点: 把当前节点删除,并链接后面的节点。

还要有最不能少的反序:

 //反序链表
CreateLinkNode.prototype.revertNode = function(){
var tmp = null;//{nextNode: null, preNode: null};
function revert(){
if(!this.nextNode){
this.preNode = null;
this.nextNode = tmp;
return this;
}else{
this.preNode = this.nextNode;
this.nextNode = tmp;
tmp = this;
return revert.call(this.preNode);
}
} return revert.call(this); }

保证链表基本机构不变,并要返回新的头节点(原来的尾节点)。和对尾节点的单独处理。

我们来测试一下(好激动)

 //  start
var ln1 = new CreateLinkNode({"name": "1"}, null, null);
var ln2 = new CreateLinkNode({"name": "2"}, ln1, null);
var ln3 = new CreateLinkNode({"name": "3"}, ln2, null);
var ln4 = new CreateLinkNode({"name": "4"}, ln3, null);
var ln5 = new CreateLinkNode({"name": "5"}, null, null);
var lHead = ln1;
ln4.insertNode(ln5); console.log(lHead.print());// ln3.removeNode();
console.log(lHead.print());//
ln2.insertNode(ln3);
console.log(lHead.print());//
lHead = lHead.revertNode();
console.log(lHead.print());//

大功告成!

js 实现链表的更多相关文章

  1. js创建链表

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

  2. js数据结构-链表

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

  3. js 单项链表

    介绍链表 链表是由一组节点组成的集合.每一个节点都使用一个对象的引用指向它的后续借点.指向另外一个借点的引用叫做链. 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组 ...

  4. js模拟链表

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

  5. js 环形链表

     function link($no){     this.no = $no;     this.next;}function addLink($num){  var $first=$cur = {} ...

  6. js模拟链表---双向链表

    双向链表: 每个元素,有一个 next(指向下一个元素)和一个prev(指向前一个元素) function dbLinkedList(){ var length=0; var head = null; ...

  7. js 之k个一组翻转链表

    题目描述 将给出的链表中的节点每\ k k 个一组翻转,返回翻转后的链表如果链表中的节点数不是\ k k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身.要求空间复杂度 \ O ...

  8. js实现存储对象的数据结构hashTable和list

    以下代码是typescript语言来写的,其实和es6面向对象的写法基本一致.大家阅读后都明白这些方法的作用. hash hash结构用于处理和表现类似key/value的键值对,其中key通常可用来 ...

  9. js算法-快速排序(Quicksort)

    快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出.在平均状况下,排序n个项目要O(nLogn)次比 ...

随机推荐

  1. Win2003 控制面板 打不开

    windown 2003 控制面板打不开 在运行框中输入regedit,进入注册表中的 HKEY_LOCAL_MACHINE/SYSTEM\Current ControlSet\Control\NLS ...

  2. (转)IBM AIX系统硬件信息查看命令(shell脚本)

    IBM AIX系统硬件信息查看命令(shell脚本) 原文:http://blog.itpub.net/22085031/viewspace-1054015/ 查看IBM AIX系统的主机型号.序列号 ...

  3. 模拟登陆并爬取Github

    因为崔前辈给出的代码运行有误,略作修改和简化了. 书上例题,不做介绍. import requests from lxml import etree class Login(object): def ...

  4. Makefile2

    规范 target可以是Object file, 可执行文件或者标签(标签一般没有依赖) 越靠近最终结果的target卸载越前面 定义target前, 定义CC, SRC, CFLAGS, OBJS, ...

  5. POJ 3259——Wormholes——————【最短路、SPFA、判负环】

    Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit St ...

  6. HDU 5371——Hotaru's problem——————【manacher处理回文】

    Hotaru's problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. xml schema数据类型

    1.简单数据类型 (1)内置简单数据类型 schema中定义了一些简单数据类型,包括primitive原始数据类型和derived派生数据类型,这些类型都是schema中使用的 最基本的数据类型,我们 ...

  8. Python基础 整形、布尔值、if条件判断、while循环、运算符、格式化输出

    1,计算机基础.2,python历史. 宏观上:python2 与 python3 区别: python2 源码不标准,混乱,重复代码太多, python3 统一 标准,去除重复代码.3,python ...

  9. 【起航计划 013】2015 起航计划 Android APIDemo的魔鬼步伐 12 App->Activity->SetWallpaper 设置壁纸 WallpaperManager getDrawingCache使用

    SetWallpaper介绍如何在Android获取当前Wallpaper,对Wallpaper做些修改,然后用修改后的图像重新设置Wallpaper.(即设置>显示>壁纸>壁纸的功 ...

  10. 如何使用Nunit进行测试

    如何使用Nunit进行测试(Visual Studio 2017 comminity) 原文:如何使用Nunit进行测试(Visual Studio 2017 comminity) 一.环境 操作系统 ...