学习Redis你必须了解的数据结构——双向链表(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/
如果我的点滴分享对你能有点滴帮助,欢迎点击下方红色按钮关注,我将持续输出分享。
学习Redis你必须了解的数据结构——双向链表(JavaScript实现)的更多相关文章
- 学习Redis你必须了解的数据结构——HashMap实现
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接博客园蜗牛 cnblogs.com\tdws . 首先提供一种获取hashCode的方法,是一种比较受欢迎的方式,该方法参照了一位园友的 ...
- 学习Redis你必须了解的数据结构——JS实现集合和ECMA6集合
集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...
- 前端学习总结(一)——常见数据结构的javascript实现
1.列表类 // 列表类 function List() { this.listSize = 0; // 列表的元素个数 this.pos = 0; // 列表的当前位置 this.dataStore ...
- 在微博微信场景下学习Redis数据结构
Redis安装 下载地址:http://redis.io/download 安装步骤: 1.yum install gcc 2.wget http://download.redis.io/releas ...
- Redis源码分析-底层数据结构盘点
前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...
- Redis(1)——5种基本数据结构
一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...
- 你真的懂Redis的5种基本数据结构吗?
摘要: 你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看. 本文分享自华为云社区<你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看>,作者:李子捌. 一 ...
- 学习Redis从这里开始
本文主要内容 Redis与其他软件的相同之处和不同之处 Redis的用法 使用Python示例代码与Redis进行简单的互动 使用Redis解决实际问题 Redis是一个远程内存数据库,它不仅性能强劲 ...
- 深入学习Redis(1):Redis内存模型
前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...
随机推荐
- css居中div的几种常用方法
在开发过程中,很多需求需要我们居中一个div,比如html文档流当中的一块div,比如弹出层内容部分这种脱离了文档流等.不同的情况有不同的居中方式,接下来就分享下一下几种常用的居中方式. 1.text ...
- iOS之UILabel的自动换行
思路: 获取UILabel的frame大小 获取UILabel的字体大小 获取UILabel的文本内容 根据上面的3部分数据,计算文本显示区域大小 根据4计算的大小,实时改变UILabel的frame ...
- SpringMVC初步
SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...
- 技术笔记:Delphi多线程应用读写锁
在多线程应用中锁是一个很简单又很复杂的技术,之所以要用到锁是因为在多进程/线程环境下,一段代码可能会被同时访问到,如果这段代码涉及到了共享资源(数据)就需要保证数据的正确性.也就是所谓的线程安全.之前 ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- C++ std::priority_queue
std::priority_queue template <class T, class Container = vector<T>, class Compare = less< ...
- C++ std::deque
std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...
- Objective-C中NSInvocation的使用
OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocation. 第一个PerformaceSelector比较常 ...
- Atitit 编程语言编程方法的进化演进 sp COP ,AOP ,SOP
Atitit 编程语言编程方法的进化演进 sp COP ,AOP ,SOP 1.1. Sp oop>>COP ,AOP ,SOP1 1.2. Sp oop 结构化方法SP(Stru ...
- iOS-----App闪退,程序崩溃---解决方案
1.iOS-中app启动闪退的原因 2.iOS开发-闪退问题-解决之前上架的 App 在 iOS 9 会闪退问题 3.iOS-应用闪退总结 4.iOS开发-捕获程序崩溃日志 5.iOS开发-应用崩溃日 ...