我们通常会在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_文件 处理

    一.字符编码 内存固定使用unicode编码 数据最先产生于内存中,是unicode格式,要想传输需要转成bytes格式 # unicode -------> enconde( u t f - ...

  2. python get_dummies与cut离散化数据

  3. 对象池1(方法功能)PoolOption

    2.对象池PoolOption(方法功能) //单类型缓冲对象管理(单模池操作管理)功能: 激活.收回.预加载等. namespace kernal { [System.Serializable] p ...

  4. spring DelegatingFilterProxy管理过滤器

    安全过滤器链 Spring Security的web架构是完全基于标准的servlet过滤器的.它没有在内部使用servlet或任何其他基于servlet的框架(比如spring mvc),所以它没有 ...

  5. 新建mavent项目报错

    1.找到自己项目 项目名\.settings\org.eclipse.wst.common.project.facet.core.xml 将<installed facet="jst. ...

  6. Winform窗体“空闲事件”

    Application.Idle += Application_Idle; void Application_Idle(object sender, EventArgs e){ } 当应用程序完成处理 ...

  7. js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别 (译)

    stackOverflow中看到了很久以前问的一个关于函数声明的问题,问题对函数剖析的特别深.这里翻译了一下组织成一篇小博文,加深一下对这两种声明方式的印象.虽是老调重弹,但是只要能帮助理解问题,不管 ...

  8. 【转载】了解CSS/CSS3原生变量var

    文章转载自:鑫空间鑫生活(https://www.zhangxinxu.com/) 原文链接:http://www.zhangxinxu.com/wordpress/?p=5804 内容摘要: 在任何 ...

  9. 《Head First 设计模式》之状态模式——糖果机

    状态模式(State) ——允许对象在内部状态时改变它的行为,对象看起来好像修改了它的类. 策略模式与状态模式的区别 状态主体(拥有者)持有状态对象,运行时可以通过动态指定状态对象来改变类的行为 策略 ...

  10. vim基本操作思维导图