Node.js环境下JavaScript实现单链表与双链表结构


Posted in Javascript onJune 12, 2016

单链表(LinkedList)的javascript实现
npmjs相关库:
complex-list、smart-list、singly-linked-list
编程思路:

  • add方法用于将元素追加到链表尾部,借由insert方法来实现;
  • 注意各个函数的边界条件处理。

自己的实现:

SingleNode.js

(function(){
 "use strict";

 function Node(element){
  this.element = element;
  this.next = null;
 }

 module.exports = Node;
})();

LinkedList.js

(function(){
 "use strict";

 var Node = require("./lib/SingleNode");

 function LinkedList(){
  this._head = new Node("This is Head Node.");
  this._size = 0;
 }

 LinkedList.prototype.isEmpty = function(){
  return this._size === 0;
 };

 LinkedList.prototype.size = function(){
  return this._size;
 };

 LinkedList.prototype.getHead = function(){
  return this._head;
 };

 LinkedList.prototype.display = function(){
  var currNode = this.getHead().next;
  while(currNode){
   console.log(currNode.element);
   currNode = currNode.next;
  }
 };

 LinkedList.prototype.remove = function(item){
  if(item) {
   var preNode = this.findPre(item);
   if(preNode == null)
    return ;
   if (preNode.next !== null) {
    preNode.next = preNode.next.next;
    this._size--;
   }
  }
 };

 LinkedList.prototype.add = function(item){
  this.insert(item);
 };

 LinkedList.prototype.insert = function(newElement, item){
  var newNode = new Node(newElement);
  var finder = item ? this.find(item) : null;
  if(!finder){
   var last = this.findLast();
   last.next = newNode;
  }
  else{
   newNode.next = finder.next;
   finder.next = newNode;
  }
  this._size++;
 };

 /*********************** Utility Functions ********************************/

 LinkedList.prototype.findLast = function(){
  var currNode = this.getHead();
  while(currNode.next){
   currNode = currNode.next;
  }
  return currNode;
 };

 LinkedList.prototype.findPre = function(item){
  var currNode = this.getHead();
  while(currNode.next !== null && currNode.next.element !== item){
   currNode = currNode.next;
  }
  return currNode;
 };

 LinkedList.prototype.find = function(item){
  if(item == null)
   return null;
  var currNode = this.getHead();
  while(currNode && currNode.element !== item){
   currNode = currNode.next;
  }
  return currNode;
 };

 module.exports = LinkedList;
})();

双链表(DoubleLinkedList)的javascript实现
npmjs相关库:
complex-list、smart-list
编程思路:

  • 双链表多了一个指向前趋的指针,故单链表中的辅助函数findPre就不需要了;
  • 增加了反向输出方法;
  • 注意边界条件的处理。

自己的实现
DoubleNode.js

(function(){
 "use strict";

 function Node(element){
  this.element = element;
  this.next = null;
  this.previous = null;
 }

 module.exports = Node;
})();

DoubleLinkedList.js

(function(){
 "use strict";
 var Node = require("./lib/DoubleNode");

 function DoubleLinkedList(){
  this._head = new Node("This is Head Node.");
  this._size = 0;
 }

 DoubleLinkedList.prototype.getHead = function(){
  return this._head;
 };

 DoubleLinkedList.prototype.isEmpty = function(){
  return this._size === 0;
 };

 DoubleLinkedList.prototype.size = function(){
  return this._size;
 };

 DoubleLinkedList.prototype.findLast = function(){
  var currNode = this.getHead();
  while(currNode.next){
   currNode = currNode.next;
  }
  return currNode;
 };

 DoubleLinkedList.prototype.add = function(item){
  if(item == null)
   return null;
  this.insert(item);
 };

 DoubleLinkedList.prototype.remove = function(item){
  if(item) {
   var node = this.find(item);
   if(node == null)
    return ;
   if (node.next === null) {
    node.previous.next = null;
    node.previous = null;
   } else{
    node.previous.next = node.next;
    node.next.previous = node.previous;
    node.next = null;
    node.previous = null;
   }
   this._size--;
  }
 };

 DoubleLinkedList.prototype.find = function(item){
  if(item == null)
   return null;
  var currNode = this.getHead();
  while(currNode && currNode.element !== item){
   currNode = currNode.next;
  }
  return currNode;
 };

 DoubleLinkedList.prototype.insert = function(newElement, item){
  var newNode = new Node(newElement);
  var finder = item ? this.find(item) : null;
  if(!finder){
   var last = this.findLast();
   newNode.previous = last;
   last.next = newNode;
  }
  else{
   newNode.next = finder.next;
   newNode.previous = finder;
   finder.next.previous = newNode;
   finder.next = newNode;
  }
  this._size++;
 };

 DoubleLinkedList.prototype.dispReverse = function(){
  var currNode = this.findLast();
  while(currNode != this.getHead()){
   console.log(currNode.element);
   currNode = currNode.previous;
  }
 };

 DoubleLinkedList.prototype.display = function(){
  var currNode = this.getHead().next;
  while(currNode){
   console.log(currNode.element);
   currNode = currNode.next;
  }
 };

 module.exports = DoubleLinkedList;
})();
Javascript 相关文章推荐
JS cookie中文乱码解决方法
Jan 28 Javascript
用JavaScript实现类似于ListBox功能示例代码
Mar 09 Javascript
javascript解析xml实现省市县三级联动的方法
Jul 25 Javascript
AngularJS 自定义过滤器详解及实例代码
Sep 14 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
从零学习node.js之利用express搭建简易论坛(七)
Feb 25 Javascript
Angularjs 实现移动端在线测评效果(推荐)
Apr 05 Javascript
ES6新特性五:Set与Map的数据结构实例分析
Apr 21 Javascript
Vue.use源码学习小结
Jun 20 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
Js跳出两级循环方法代码实例
Sep 22 Javascript
原生JavaScript实现弹幕组件的示例代码
Oct 12 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
Jun 12 #Javascript
深入解析JavaScript中的arguments对象
Jun 12 #Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 #Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 #Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
Jun 12 #Javascript
仅一个form表单 js实现注册信息依次填写提交功能
Jun 12 #Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
Jun 12 #Javascript
You might like
色色整理的PHP面试题集锦
2012/03/08 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
QUnit jQuery的TDD框架
2010/11/04 Javascript
js 数据类型转换总结笔记
2011/01/17 Javascript
Javascript 类、命名空间、代码组织代码
2011/07/31 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
python中scikit-learn机器代码实例
2018/08/05 Python
python3 拼接字符串的7种方法
2018/09/12 Python
Pyqt5实现英文学习词典
2019/06/24 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
python-numpy-指数分布实例详解
2019/12/07 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
Hotels.com印度:酒店预订
2019/05/11 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
常见的软件开发流程有哪些
2015/11/14 面试题
八项规定整改措施
2014/02/12 职场文书
转让协议书范本
2014/09/13 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
centos7安装mysql5.7经验记录
2022/05/02 Servers