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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
用js实现的一个Flash滚动轮换显示图片代码生成器
Mar 14 Javascript
JavaScript 拖拉缩放效果
Dec 10 Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
Nov 12 Javascript
纯js实现html转pdf的简单实例(推荐)
Feb 16 Javascript
JS对象创建的几种方式整理
Feb 28 Javascript
angularjs+bootstrap菜单的使用示例代码
Mar 07 Javascript
Jquery把获取到的input值转换成json
May 15 jQuery
JavaScript实现简单的隐藏式侧边栏功能示例
Aug 31 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
Sep 04 Javascript
如何使用vue3打造一个物料库
May 08 Vue.js
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
Zend的MVC机制使用分析(二)
2013/05/02 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
JavaScript实用技巧(一)
2010/08/16 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
js Date概念详细介绍
2013/11/22 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
JS实现数字格式千分位相互转换方法
2016/08/01 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
python实现目录树生成示例
2014/03/28 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
Python贪心算法实例小结
2018/04/22 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
C语言50道问题
2014/10/23 面试题
车间班组长岗位职责
2013/11/13 职场文书
面试后的英文感谢信
2014/02/01 职场文书
离婚财产分配协议书
2014/10/21 职场文书
小学教师岗位职责
2015/04/02 职场文书
2015年医院护理部工作总结
2015/04/23 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫