我们通常会在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. Python字符和编码

    1. 字符和编码 背景 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte). 由于计算机是美国人发明的,因此, ...

  2. jemeter、windox下安装教程

    JMeter是Apache软件基金会的产品,用于对静态和动态的资源(文件,Servlet,Perl脚本,Java对象,数据库和查询,FTP服务器等等)的性能进行测试,是一款很方便的测试软件. 系统:w ...

  3. 带你认识spark安装包的目录结构

    福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟   ...

  4. HDU 5587——Array——————【规律】

    Array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  5. 读取和写入Cookies

    #region 读取或写入cookie 2 /// <summary> 3 /// 写cookie值 4 /// </summary> 5 /// <param name ...

  6. css内容整理1

    1.css引入的四种方式1.行内2.内嵌3.链接 <link href="1.css" rel="stylesheet">4.导入@import u ...

  7. angular的多个模块执行 angular里 字符串与对象的互转

    1.disable : true ,禁用 2.$timeout 计时器 $interval.cancel(timer); 3.app.run();  可以不使用控制器就开启数据,但适合$rootsco ...

  8. 使用axios请求发送数据

    之前一直没有用成功,今天看了一些博客,学会了使用axios插件 1.首先就是下载依赖啦 2.main.js import axios from 'axios'Vue.prototype.$axios ...

  9. table表格td内内容自动换行

    项目开发时,遇到问题:td内传入数据,全是字母,不会自动换行 一般字母数字/特殊符号的话,会被浏览器默认是一个字符串或者说一个单词,不会自动换行 所以需要设置一下,让表格内容自动换行. 1.给td标签 ...

  10. scss牛刀小试:解决css中适配浏览器前缀问题

    在css中为适配浏览器,新特性总加 -webkit,-o, -moz 来适配浏览器,写的烦心,看着也臃肿,让css可读性降低,下面以阴影为例,如何使用scss让我们的css看起来更简洁. 本人使用的I ...