JavaScript实现双向链表
title: JavaScript实现双向链表
toc: false
date: 2018-10-07 10:11:36

- append(element): 添加元素到链表尾部
- insert(position,element): 向双向链表中某个位置插入元素
- removeAt(position): 移除双向链表中某个位置的元素
- getHead(): 获取双向链表的头部
- getTail(): 获取双向链表的尾部
- isEmpty(): 检查双向链表是否为空,为空则返回true
- size(): 返回双向链表长度
function DoublyLinkedList() {
var Node = function (element) {
this.element = element;
this.next = null;
this.prev = null;
}
var length = 0;
var head = null;
var tail = null;
this.append = function (element) {
var node = new Node(element);
if (head === null) {
head = node
tail = node
} else {
tail.next = node;
node.prev = tail;
tail = node;
}
length++;
return true;
}
/**
* 向双向链表中某个位置插入元素
*
* @param {any} position 要插入的位置
* @param {any} element 要插入的元素
* @returns 插入成功或失败
*/
this.insert = function (position, element) {
var node = new Node(element),
current = head,
previous,
index = 0;
if (position < 0 && position > length) {
return false;
}
if (position === 0) {
node.next = head
head.prev = node
head = node
} else if (position === length) {
tail.next = node;
node.prev = tail;
tail = node;
} else {
while (index++ < position) {
previous = current
current = current.next;
}
previous.next = node;
node.prev = previous;
node.next = current;
current.prev = node;
}
length++;
return true;
}
/**
* 移除双向链表中某个位置的元素
*
* @param {any} position 要移除元素的位置
* @returns 移除成功,返回移除的元素
*/
this.removeAt = function (position) {
var previous,
current = head,
index = 0;
if (position < 0 && position >= length) {
return false;
}
if (position === 0) {
head = current.next;
head.prev = null;
} else if(position === length - 1) {
current = tail;
tail = current.prev;
tail.next = null;
} else {
while (index++ < position) {
previous = current
current = current.next;
}
previous.next = current.next;
current.next.prev = previous;
}
length--;
return current.element;
}
this.getHead = function () {
return head.element;
}
this.isEmpty = function () {
return length === 0
}
this.getTail = function () {
return tail.element;
}
this.size = function () {
return length
}
}
JavaScript实现双向链表的更多相关文章
- 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- JavaScript数据结构与算法(七) 双向链表的实现
TypeScript方式实现源码 // 双向链表和普通链表的区别在于, 在链表中, // 一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素, // 另一个链向前一个元 ...
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- JavaScript——双向链表实现
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- 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数据结 ...
随机推荐
- TLP电源管理
笔记本电脑电池坏了, 换了块电池, 顺手装了一下这个电源管理软件. https://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-manage ...
- 7.treeview
ui mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include < ...
- flask-alembic数据迁移工具
alembic是用来做ORM模型与数据库的迁移与映射.alembic使用方式跟git有点类似,表现在两个方面, 第一,alemibi的所有命令都是以alembic开头: 第二,alembic的迁移文件 ...
- How to include custom library into maven local repository?--转
原文地址:https://www.mkyong.com/maven/how-to-include-library-manully-into-maven-local-repository/ There ...
- DIV水平方向居中的几种方法
一.使用margin: 1 #center0 { 2 background: red; 3 margin: 0 auto; 4 } 或者: margin: auto; 这样的前提是父盒子里没有其他盒子 ...
- Firefox Quantum:开发者版本 推荐
为生民,不谋利 欢迎您使用 Firefox 开发者版本.使用此版本可获得最新功能.高速性能,以及您打造开放 Web 所需的开发工具. https://www.mozilla.org/zh-CN/fir ...
- 最新消息,CDRX7冰点价再返现,你知道么?
一年一度的七夕又到来了,这不很多的单身狗朋友们都已经自备好了狗粮,准备在家里宅上一天呢? 开个玩笑今天小编就为各位带来了 一个劲爆大消息... Deng/deng/deng/deng..就是备受万众瞩 ...
- ZBrush通过显示与隐藏得到子物体
在ZBrush®中得到子物体的方法有很多,本文将为大家介绍一种新的创建子物体的方法,通过显示和隐藏得到子物. ZBrush 4R8中文版下载:http://wm.makeding.com/iclk/? ...
- Linux 环境中从源代码编译安装 ReText 问题与解决
从源代码编译安装 ReText 问题与解决 1. 如何安装 Python Markups 1.1 从 https://launchpad.net/python-markups 下载 Python Ma ...
- windows下一台机器运行多个tomcat
一.将本机原有的tomcat配置不变, 二.下载新的tomcat解压版,地址:http://tomcat.apache.org/download-80.cgi 三.下载完成解压后,为了方便区分,最好将 ...