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获取提交的字符串的字节数
Feb 09 Javascript
js设置function参数默认值(适合没有传参情况)
Feb 24 Javascript
jQuery中;function($,undefined) 前面的分号的用处
Dec 17 Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 Javascript
AjaxUpLoad.js实现文件上传
Mar 05 Javascript
Vue.js实现图片的随意拖动方法
Mar 08 Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 Javascript
推荐几个不错的console调试技巧实现
Dec 20 Javascript
vue实现数字滚动效果
Jun 29 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
Oct 14 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 SQL之where语句生成器
2009/03/24 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
javascript Array.remove() 数组删除
2009/08/06 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
理解javascript中的闭包
2017/01/11 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
python图形用户接口实例详解
2019/12/16 Python
python 操作hive pyhs2方式
2019/12/21 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
如何利用python读取micaps文件详解
2020/10/18 Python
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
文案策划求职信
2014/03/18 职场文书
读书月活动方案
2014/05/22 职场文书
政府四风问题整改措施
2014/10/04 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
民事答辩状格式范文
2015/05/21 职场文书
创业计划书之水果店
2019/07/18 职场文书
python实现局部图像放大
2021/11/17 Python