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实现双向链表的更多相关文章

  1. 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  2. JavaScript数据结构与算法(七) 双向链表的实现

    TypeScript方式实现源码 // 双向链表和普通链表的区别在于, 在链表中, // 一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素, // 另一个链向前一个元 ...

  3. 《剑指offer》— JavaScript(26)二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...

  4. JavaScript——双向链表实现

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  5. javascript中的链表结构—双向链表

    1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...

  6. javascript实现数据结构与算法系列:循环链表与双向链表

    循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. w ...

  7. JavaScript数据结构-8.双向链表

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. javascript普通链表及双向链表

    写代码的真是心细啊,每一步操作的先后顺序都在卡准. 我其实只是理解了思想和大概的操作. 真正要用时,可能还是要复制,粘贴...:) function LinkedList(){ var Node = ...

  9. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

随机推荐

  1. 25.QT进度条

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> 5 #include <QProgressBar&g ...

  2. python网络编程三次握手和四次挥手

    TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的 ...

  3. 远程桌面连接Windows Azure中的Ubuntu虚拟机

    默认情况下,通过Windows Azure创建的ubuntu虚拟机是不能直接连接远程桌面的,只能通过SSH终端连接. 在Windows Azure Portal中创建Ubuntu虚拟机,创建完成后添加 ...

  4. windows中安装redis的phpredis扩展

    1. 下载php的redis扩展 打开网址 http://pecl.php.net/ (php的扩展库官网),搜索redis,进入地址:http://pecl.php.net/package/redi ...

  5. 迁移oracle数据库至新分区

    本文地址: http://www.cnblogs.com/blackmanba/p/move-oracle-database.html或者http://forkme.info/move-oracle- ...

  6. 一个javascript面试题解析

    ; function fn(){ console.log(this.length); } var obj = { length: , method: function (fn) { fn(); // ...

  7. RocketMQ学习笔记(11)----RocketMQ的PushConsumer和PullConsumer

    1. PushConsumer 推,Broker主动向Consumer推消息,它Consumer的一种,应用通常向对象注册一个Listener接口,一旦接收到消息,Consumer对象立刻回调Lins ...

  8. jQuery选择器、事件、节点、动画效果

    一.选择器  基本选择器:    标签选择器:  $("h1").css()    类选择器:  $(".c").css()    id选择器:  $(&quo ...

  9. 最近邻插值法&线性插值&双线性插值&三线性插值

    最近邻插值法nearest_neighbor是最简单的灰度值插值.也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值. 造成的空间偏移误差为像素单位,计算简单,但不够精确.但当图像 ...

  10. 对于 wepy 不是内部或外部命令 -- 的解决办法

    闲来没事继续研究自己之前一直未解决的问题,  就是自己笔记本安装wepy-cli,一直提示"wepy 不是内部或外部命令". 因为公司里面用的是这个框架, 想着自己在家没事的时候去 ...