我们通常会在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. 事务(JDBC、Spring)

    如果不用spring管理事务,我们自己写代码来操作事务.那么这个代码怎么写要看底层怎么访问数据库了. 当采用原生JDBC访问数据库时,操作事务需要使用java.sql.Connection的API.开 ...

  2. Oracle基础篇--03DML语言

    1.数据准备: --创建表格的 create table dept as select * from scott.dept; create table emp as select * from sco ...

  3. shell代码模板

    批量ssh登录机器 #site_search_hosts 10.4.16.205,10.4.20.87,10.4.20.88,10.4.20.89,10.4.20.90,10.4.20.92,10.4 ...

  4. python的基础数据类型

    Python基础数据类型 定义: int    => 数字类型 str   => 字符串数据类型 bool  =>布尔值,True False list 列表,用来存放大量数据  [ ...

  5. mysql中添加中文存储和显示功能

    1. 在 /etc/mysql/my.cnf中添加 [mysqld]character-set-server=utf8 [client]default-character-set=utf8 2. 检查 ...

  6. 转:自定义控件三部曲之动画篇——alpha、scale、translate、rotate、set的xml属性及用法

    第一篇: 一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resour ...

  7. My first Python program(附增加清屏方法)

    #TempConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in ['F', 'f']: C = (eval(Te ...

  8. Hadoop2.X HA架构与部署

    HDFS-HA原理及配置 1.HDFS-HA架构原理介绍 hadoop2.x之后,Clouera提出了QJM/Qurom Journal Manager,这是一个基于Paxos算法实现的HDFS HA ...

  9. stl::iterator汇总

    STL——iterator 一.概述Iterator(迭代器)模式又称Cursor(游标)模式, 根据STL中的分类,iterator包括:Input Iterator:只能单步向前迭代元素,不允许修 ...

  10. EasyUI 数据网格 - 设置排序并自定义排序

    数据网格(DataGrid)的所有列可以通过点击列表头来排序.您可以定义哪列可以排序.默认的,列是不能排序的,除非您设置 sortable 属性为 true. 当排序时,数据网格(DataGrid)将 ...