本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 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/

如果我的点滴分享对你能有点滴帮助,欢迎点击下方红色按钮关注,我将持续输出分享。

学习Redis你必须了解的数据结构——双向链表(JavaScript实现)的更多相关文章

  1. 学习Redis你必须了解的数据结构——HashMap实现

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接博客园蜗牛 cnblogs.com\tdws . 首先提供一种获取hashCode的方法,是一种比较受欢迎的方式,该方法参照了一位园友的 ...

  2. 学习Redis你必须了解的数据结构——JS实现集合和ECMA6集合

    集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...

  3. 前端学习总结(一)——常见数据结构的javascript实现

    1.列表类 // 列表类 function List() { this.listSize = 0; // 列表的元素个数 this.pos = 0; // 列表的当前位置 this.dataStore ...

  4. 在微博微信场景下学习Redis数据结构

    Redis安装 下载地址:http://redis.io/download 安装步骤: 1.yum install gcc 2.wget http://download.redis.io/releas ...

  5. Redis源码分析-底层数据结构盘点

    前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...

  6. Redis(1)——5种基本数据结构

    一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...

  7. 你真的懂Redis的5种基本数据结构吗?

    摘要: 你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看. 本文分享自华为云社区<你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看>,作者:李子捌. 一 ...

  8. 学习Redis从这里开始

    本文主要内容 Redis与其他软件的相同之处和不同之处 Redis的用法 使用Python示例代码与Redis进行简单的互动 使用Redis解决实际问题 Redis是一个远程内存数据库,它不仅性能强劲 ...

  9. 深入学习Redis(1):Redis内存模型

    前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

随机推荐

  1. 【Web动画】SVG 线条动画入门

    通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...

  2. 主成分分析(PCA)原理总结

    主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...

  3. AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager

    让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...

  4. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  5. SQLServer 各版本区别

    SQLServer 2012 新特性 通过AlwaysOn实现各种高可用级别 通过列存储索引技术实现超快速的查询,其中星型链接查询及相似查询的性能提升幅度可高达100倍,同时支持超快速的全文查询 通过 ...

  6. linux系统内存爆满的解决办法!~

    1.首先用free工具检查一下内存的使用情况: 这个是我的linux时时数据 Mem: 4046824 763620 3283204 9004 10284 61560  -/+buffers/cach ...

  7. Xamarin.Android-用ZXing实现二维码扫描以及连续扫描

    一.前言 本文的内容有两个基础:ZXing.Net和ZXing.Net.Mobile ZXing.Net:ZXing的C#实现,主要封装了各种二维码的编码.解码等跨平台的算法 ZXing.Net.Mo ...

  8. Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )

    在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...

  9. APUE fig 1.10示例代码的完善--对提示符及输入回车的优化

    APUE 第3版第15页的shell2.c示例程序,运行效果如下: gcc ol.shell.c -o origin_shell ./origin_shell % date 2015年12月13日 星 ...

  10. ceph架构剖析

    unitedstack有云 :https://www.ustack.com/blog/ceph_infra/