什么是双向链表?
双向链表(Doubly Linked List)是一种常见的数据结构,它由多个节点组成,每个节点有两个指针,一个指向前一个节点,一个指向后一个节点。双向链表支持从前往后和从后往前遍历节点,对于插入和删除节点操作,其时间复杂度都是 O(1)。
为什么要使用 @humanwhocodes/doubly-linked-list?
JavaScript 中没有内置的双向链表数据类型,但是在很多情况下需要使用到链表数据结构,比如实现 LRU 缓存算法、实现浏览器的前进后退、实现某些算法等等。@humanwhocodes/doubly-linked-list 是一个 npm 包,提供了一个简单易用的双向链表实现。
如何使用 @humanwhocodes/doubly-linked-list?
安装
使用 npm 包管理器安装 @humanwhocodes/doubly-linked-list,命令如下:
npm install @humanwhocodes/doubly-linked-list
引入
在代码中引入 @humanwhocodes/doubly-linked-list,命令如下:
const DoublyLinkedList = require('@humanwhocodes/doubly-linked-list');
创建链表
使用如下方式创建一个链表:
const list = new DoublyLinkedList();
插入节点
使用如下方式在链表头部插入一个节点:
list.unshift({ data: 'hello', });
使用如下方式在链表尾部插入一个节点:
list.push({ data: 'world', });
遍历节点
使用如下方式从头部遍历节点并输出节点数据:
let current = list.head; while (current !== null) { console.log(current.data); current = current.next; }
使用如下方式从尾部遍历节点并输出节点数据:
let current = list.tail; while (current !== null) { console.log(current.data); current = current.prev; }
删除节点
使用如下方式从头部删除一个节点:
list.shift();
使用如下方式从尾部删除一个节点:
list.pop();
示例代码
-- -------------------- ---- ------- ----- ---------------- - --------------------------------------------- ----- ---- - --- ------------------- -------------- ----- -------- --- ----------- ----- -------- --- -------------- ----- ----- --- ----------- ----- ------- --- ---------------------- --- ------- - ---------- ----- -------- --- ----- - -------------------------- ------- - ------------- - ---------------------- ------- - ---------- ----- -------- --- ----- - -------------------------- ------- - ------------- - ------------- ----------- ---------------------- ------- - ---------- ----- -------- --- ----- - -------------------------- ------- - ------------- -
输出结果如下:
-- -------------------- ---- ------- ------ -- ----- ----- ---- ------ ---- ----- ----- -- ------ ----- -----
总结
双向链表是一种常用的数据结构,对于实现某些算法和设计某些系统都有很大的帮助,但是 JavaScript 中没有内置的链表数据类型。@humanwhocodes/doubly-linked-list 是一个简单易用的 npm 包,提供了一个双向链表数据结构的实现,可以方便地在 JavaScript 中使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600672513660cf7123b3631e