JavaScript——双向链表实现
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/
下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧。对链表的实现不是很了解的可以移步:http://www.cnblogs.com/tdws/p/6033209.html
双向链表与链表的不同之处主要在于他的双向查找。因为在这种结构中我们设计了每个节点的prev(向上查找)的引用或指针和next(向下查找)的引用或指针。得益于这种结构你能做到正向和反向的查找。你也可以在查找某个index位置的元素时,根据其长度计算,到底是使用正向还是反向,这取决于你自己。
直接上代码吧,详解在注释里:
先看一下代码的整体结构:

下面是具体实现:
function DoublyLinkedList() {
var Node = function (element) {
this.element = element;
this.next = null; //下一个是谁
this.prev = null; //上一个是谁
};
var head = null;
var length = ;
var tail = ;
this.insert = function (position, element) {
if (position >= && position <= length) {
var node = new Node(element);
var current = head;
var index = ;
var previous;
if (position == ) {
if (head == null) { //空链表
head = node;
tail = node;
} else {
head = node; //新元素作为头部
head.next = current; //头部的下一个节点是旧头部
current.prev = node; //旧头部的上一个节点是新元素
}
} else if (position == length) { //尾部
current = tail;
current.next = node; //旧尾部的下一个节点 是新节点
node.prev = current; //新节点的上一个节点是旧尾部
tail = node; //更新尾部节点为新元素
} else {
while (index < position) {
previous = current;
current = current.next;
index++;
} //遍历后current为当前position的节点
node.next = current; //新节点的next是current
previous.next = node; //上节点的下一个是新元素
node.prev = previous; //新元素的上个节点是previous
current.previous = node; //current的上个节点是新元素
}
length++;
return true;
} else {
return false;
}
};
this.removeAt = function (position) {
if (position > - && position < length) {
var current = head;
var index = ;
var previous;
if (position == ) {
head = current.next; //给head赋值为 下个节点,不关心其是否为null
if (length == ) { //如果长度为1 head已经为null,则将tail置为null
tail = null;
} else { //head已经赋值为下个节点
head.prev = null; //head的prev置为null
}
} else if (position == length - ) { //最后一个元素
current = tail;
tail = current.prev;
tail.next = null;
} else {
while (index++ < position) { //普通中间元素
previous = current.prev;
current = current.next;
} //遍历后得到当前position元素
previous.next = current.next; //当前osition元素的prev指向当前postion元素的下个元素
current.next.prev = previous; //总之越过一个
}
length--;
return current.element;
} else {
return null;
}
};
this.getLength = function () {
return length;
};
this.toString = function () {
var current = head;
var string = '';
while (current) {
string += ',' + current.element;
current = current.next;
}
return string;
};
}
废话也不多说了,关于双向链表的文章网上一搜一大堆。
顺便提到的就是Redis五大数据类型中的List列表类型,我们知道Redis列表我们可以正向查找元素,也可以反向查找元素。这也算是双向链表在实际中的一大用途吧。
Redis相关文章链接 http://www.cnblogs.com/tdws/tag/NoSql/
如果我的点滴分享对你能有点滴帮助,欢迎点击下方红色按钮关注,我将持续输出分享。
JavaScript——双向链表实现的更多相关文章
- 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- JavaScript数据结构与算法(七) 双向链表的实现
TypeScript方式实现源码 // 双向链表和普通链表的区别在于, 在链表中, // 一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素, // 另一个链向前一个元 ...
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- JavaScript实现双向链表
title: JavaScript实现双向链表 toc: false date: 2018-10-07 10:11:36 append(element): 添加元素到链表尾部 insert(posit ...
- javascript中的链表结构—双向链表
1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...
- javascript实现数据结构与算法系列:循环链表与双向链表
循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. w ...
- JavaScript数据结构-8.双向链表
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- javascript普通链表及双向链表
写代码的真是心细啊,每一步操作的先后顺序都在卡准. 我其实只是理解了思想和大概的操作. 真正要用时,可能还是要复制,粘贴...:) function LinkedList(){ var Node = ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
随机推荐
- spring中的传播性 个人认为就是对方法的设置 其作用能传播到里面包含的方法上
spring中的传播性 个人认为就是对方法的设置 其作用能传播到里面包含的方法上
- MySQL5.7安装(RPM)笔记
1. 检查MySQL是否安装,如果有安装,则移除(rpm –e 名称)[root@localhost ~]# rpm -qa | grep -i mysqlmysql-libs-xxxxxxxxxx. ...
- Exploring Pyramids UVALive - 3516 (记忆化DP)
题意:给定一个序列 问有多少棵树与之对应 题目连接:https://cn.vjudge.net/problem/UVALive-3516 对于这一序列 分两种2情况 当前分支 和 其它分支 用df ...
- 开始学习Scheme
开始学习Scheme 函数式编程(Functional Programming)是在MIT研究人工智能(Artificial Intelligence)时发明的,其编程语言为Lisp.确切地说,L ...
- 【poj3693】 Maximum repetition substring
http://poj.org/problem?id=3693 (题目链接) 题意 给定一个字符串,求重复次数最多的连续重复子串,若存在多组解,输出字典序最小的. Solution 后缀数组论文题,就是 ...
- 解题:BZOJ 5093 图的价值
题面 显然只需要考虑一个点(再乘n),那么枚举这个点的度数,另外的$\frac{(n-1)(n-2)}{2}$条边是随意连的,而这个点连出去的边又和其余$n-1$个点产生组合,所以答案就是 $n*\f ...
- DynamicSegmentTree
最近尝试了一下动态开点线段树,英文直译就是Dynamic Open Point Segment Tree,太SB了. 就跟之前的主席树写法差不多. if(!x || x == y) { x = ++t ...
- spring in action 学习笔记八:用@Primary 或者@Qualifier消除@Autowired引起的歧义现象
首先解释一下@Primary和@Qualifier这两个注解的意思:@Primary的意思是在众多相同的bean中,优先使用用@Primary注解的bean.而@Qualifier这个注解则指定某个b ...
- IDE和SDK
像我这种不是专科班出来的,真的很多概念都不太清楚,今天来说说IDE和SDK 简单的来说: IDE(集成开发环境 Integrated Development Environment) 就是我们编写代码 ...
- webpack提取库
有时候我们不想bundle.js过于大,想把一些库独立成文件单独拿出来 module.exports = { entry: { // bundle是我们要打包的项目文件的导出名字, app是入口js文 ...