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 相关文章推荐
Javascript 静态页面实现随机显示广告的办法
Nov 17 Javascript
jquery中animate的stop()方法作用实例分析
Jan 30 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
jquery实现图片上传之前预览的方法
Jul 11 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
Sep 10 Javascript
每日十条JavaScript经验技巧(一)
Jun 23 Javascript
详解vue中axios的使用与封装
Mar 20 Javascript
原生JS实现列表内容自动向上滚动效果
May 22 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
Sep 29 Javascript
React中Ref 的使用方法详解
Apr 28 Javascript
微信小程序自定义胶囊样式
Dec 27 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
星际玩家的三大定律
2020/03/04 星际争霸
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
PHP常用技巧汇总
2016/03/04 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
php格式文件打开的四种方法
2018/02/24 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
r.js来合并压缩css文件的示例
2018/04/26 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
Python走楼梯问题解决方法示例
2018/07/25 Python
Python 切分数组实例解析
2019/11/07 Python
Python实现数值积分方式
2019/11/20 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
.NET面试问题集
2015/12/08 面试题
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
教师读书活动总结
2014/05/07 职场文书
升学宴演讲稿
2014/09/01 职场文书
司机个人年终总结
2015/03/03 职场文书
小学2016年“我们的节日·重阳节”活动总结
2016/04/01 职场文书
Python 内置函数速查表一览
2021/06/02 Python
vue elementUI表格控制对应列
2022/04/13 Vue.js
Redis批量生成数据的实现
2022/06/05 Redis