JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】


Posted in Javascript onApril 28, 2020

本文实例讲述了JavaScript 双向链表操作。分享给大家供大家参考,具体如下:

一个 双向链表(doubly linked list) 是由一组称为节点的顺序链接记录组成的链接数据结构。每个节点包含两个字段,称为链接,它们是对节点序列中上一个节点和下一个节点的引用

开始节点和结束节点的上一个链接和下一个链接分别指向某种终止节点,通常是前哨节点或null,以方便遍历列表。如果只有一个前哨节点,则列表通过前哨节点循环链接。它可以被概念化为两个由相同数据项组成的单链表,但顺序相反。

class DNode {
 constructor(val) {
  this.val = val;
  this.prev = null;
  this.next = null;
 }
}

增加节点

function add(el) {
  var currNode = this.head;
  while (currNode.next != null) {
    currNode = currNode.next;
  }
  var newNode = new DNode(el);
  newNode.next = currNode.next;
  currNode.next = newNode;
}

查找

function find(el) {
  var currNode = this.head;
  while (currNode && currNode.el != el) {
    currNode = currNode.next;
  }
  return currNode;
}

插入

function (newEl, oldEl) {
  var newNode = new DNode(newEl);
  var currNode = this.find(oldEl);
  if (currNode) {
    newNode.next = currNode.next;
    newNode.prev = currNode;
    currNode.next = newNode;
  } else {
    throw new Error('未找到指定要插入节点位置对应的值!')
  }
}

展示

// 顺序
function () {
  var currNode = this.head.next;
  while (currNode) {
    console.log(currNode.el);
    currNode = currNode.next;
  }
}

// 逆序
function () {
  var currNode = this.head;
  currNode = this.findLast();
  while (currNode.prev != null) {
    console(currNode.el);
    currNode = currNode.prev;
  }
}

删除

function (el) {
  var currNode = this.find(el);
  if (currNode && currNode.next != null) {
    currNode.prev.next = currNode.next;
    currNode.next.prev = currNode.prev;
    currNode.next = null;
    currNode.previous = null;
  } else {
    throw new Error('找不到要删除对应的节点');
  }
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
Apr 15 Javascript
jquery的键盘事件修改代码
Feb 24 Javascript
JS中的prototype与面向对象的实例讲解
May 22 Javascript
jQuery使用ajaxSubmit()提交表单示例
Apr 04 Javascript
JavaScript常用验证函数实例汇总
Nov 25 Javascript
javascript常用函数(1)
Nov 04 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
May 10 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
Aug 01 Javascript
vue实现移动端图片裁剪上传功能
Aug 18 Javascript
layui 上传文件_批量导入数据UI的方法
Sep 23 Javascript
JavaScript观察者模式原理与用法实例详解
Mar 10 Javascript
Vue Element plus使用方法梳理
Dec 24 Vue.js
JS 创建对象的模式实例小结
Apr 28 #Javascript
JavaScript console的使用方法实例分析
Apr 28 #Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 #Javascript
JavaScript Date对象功能与用法学习记录
Apr 28 #Javascript
JavaScript 链表定义与使用方法示例
Apr 28 #Javascript
Vue 3.0 全家桶抢先体验
Apr 28 #Javascript
React生命周期原理与用法踩坑笔记
Apr 28 #Javascript
You might like
来自phpguru得Php Cache类源码
2010/04/15 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
Python pass详细介绍及实例代码
2016/11/24 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
django_orm查询性能优化方法
2018/08/20 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Python页面加载的等待方式总结
2021/02/28 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
Structs界面控制层技术
2013/10/11 面试题
物业门卫岗位职责
2013/12/28 职场文书
《悯农》教学反思
2014/04/28 职场文书
师德师风承诺书
2014/05/23 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
办公室岗位职责
2015/02/04 职场文书
2015年个人审计工作总结
2015/04/07 职场文书