美文网首页前端大杂烩
数据结构 — 双向链表

数据结构 — 双向链表

作者: lio_zero | 来源:发表于2022-05-28 20:10 被阅读0次

双向链表,又称为双链表,是一种表示元素集合的线性数据结构,其中每个元素都指向下一个和上一个元素。双向链表中的第一个元素是 head,最后一个元素是 tail。

JavaScript 双向链表可视化

双向链表数据结构的每个元素必须具有以下属性:

  • value:元素的值
  • next:指向双向链表中下一个元素的指针(如果没有,则为 null
  • previous:指向双向链表中上一个元素的指针(如果没有,则为 null

双向链表数据结构的主要属性有:

  • size:双向链表中的元素个数
  • head:双向链表中的第一个元素
  • tail:双向链表中的最后一个元素

双向链表数据结构的主要操作有:

  • insertAt:在特定索引处插入元素
  • removeAt:删除特定索引处的元素
  • getAt:检索特定索引处的元素
  • clear:清空双向链表
  • reverse:反转双向链表中元素的顺序

JavaScript 实现

class DoublyLinkedList {
  constructor() {
    this.nodes = []
  }

  get size() {
    return this.nodes.length
  }

  get head() {
    return this.size ? this.nodes[0] : null
  }

  get tail() {
    return this.size ? this.nodes[this.size - 1] : null
  }

  insertAt(index, value) {
    const previousNode = this.nodes[index - 1] || null
    const nextNode = this.nodes[index] || null
    const node = { value, next: nextNode, previous: previousNode }

    if (previousNode) previousNode.next = node
    if (nextNode) nextNode.previous = node
    this.nodes.splice(index, 0, node)
  }

  insertFirst(value) {
    this.insertAt(0, value)
  }

  insertLast(value) {
    this.insertAt(this.size, value)
  }

  getAt(index) {
    return this.nodes[index]
  }

  removeAt(index) {
    const previousNode = this.nodes[index - 1] || null
    const nextNode = this.nodes[index + 1] || null

    if (previousNode) previousNode.next = nextNode
    if (nextNode) nextNode.previous = previousNode

    return this.nodes.splice(index, 1)
  }

  clear() {
    this.nodes = []
  }

  reverse() {
    this.nodes = this.nodes.reduce((acc, { value }) => {
      const nextNode = acc[0] || null
      const node = { value, next: nextNode, previous: null }
      if (nextNode) nextNode.previous = node
      return [node, ...acc]
    }, [])
  }

  *[Symbol.iterator]() {
    yield* this.nodes
  }
}
  • 创建一个具有 constructor 的类(class),为每个实例初始化一个空数组 nodes
  • 定义一个 size getter,它使用 Array.prototype.length 返回 nodes 数组中元素的数量。
  • 定义一个 head getter,它返回 nodes 数组的第一个元素,如果为空,则返回 null
  • 定义一个 tail getter,它返回 nodes 数组的最后一个元素,如果为空,则返回 null
  • 定义一个 insertAt() 方法,使用 Array.prototype.splice()nodes 数组中添加新对象,分别更新上一个元素的 next 键和下一个元素的 previous 键。
  • 定义两个便捷的方法 insertFirst()insertLast(),它们分别使用 insertAt() 方法在 nodes 数组的开头或结尾插入新元素。
  • 定义一个 getAt() 方法,用于检索给定 index 的元素。
  • 定义一个 removeAt() 方法,使用 Array.prototype.splice() 删除 nodes 数组中的对象,分别更新上一个元素的 next 键和下一个元素的 previous 键。
  • 定义一个 clear() 方法,清空 nodes 数组。
  • 定义一个 reverse() 方法,使用 Array.prototype.reduce() 和扩展运算符(...)来反转 nodes 数组的顺序,适当地更新每个元素的 nextprevious 键。
  • Symbol.iterator 定义一个生成器方法,使用 yield* 语法委托给 nodes 数组的迭代器。
const list = new DoublyLinkedList()

list.insertFirst(1)
list.insertFirst(2)
list.insertFirst(3)
list.insertLast(4)
list.insertAt(3, 5)

list.size // 5
list.head.value // 3
list.head.next.value // 2
list.tail.value // 4
list.tail.previous.value // 5
;[...list].map((e) => e.value) // [3, 2, 1, 5, 4]

list.removeAt(1) // 2
list.getAt(1).value // 1
list.head.next.value // 1
;[...list].map((e) => e.value) // [3, 1, 5, 4]

list.reverse()
;[...list].map((e) => e.value) // [4, 5, 1, 3]

list.clear()
list.size // 0

以上内容译自 30 seconds of code 的 JavaScript Data Structures - Doubly Linked List

Leetcode 相关的双向链表题目

更多资料

Doubly Linked List

相关文章

  • 线性表-双向链表与双向循环链表

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

  • Go语言数据结构和算法-DoubleLinkedList(双向链

    Go语言数据结构和算法-DoubleLinkedList(双向链表) 双向链表的数据结构 Prepend(val)...

  • 2019-12-04 Java-LinkedList源码解读

    @TOC 1、链表数据结构 链表分为单向链表和双向链表,他们的区别在于,单向链表只能单向寻址,而双向链表可以双向寻...

  • 数据结构与算法(四)-- 双向链表

    双向链表 双向链表的数据结构设计 双向链表的数据结构设计和单向链表的结构差别不大,需要添加一个指针域用来指向前驱结...

  • 数据结构——Golang实现双向链表

    转载请注明出处:数据结构——Golang实现双向链表 1. 双向链表 双向链表也叫双链表,是链表的一种,它的每个数...

  • 常见的数据结构

    常见的数据结构有: 数组 链表单链表、双向链表、循环链表、双向循环链表、静态链表 栈顺序栈、链式栈 队列普通队列、...

  • 一起探秘,不可不知双向链表底层原理

    双向链表与数据结构 什么是LinkedList LinkList是一个双向链表(双链表);它是链表的一种,也是最常...

  • iOS autoreleasepool

    1. 数据结构 parent和child使AutoreleasePoolPage对象组成一个双向链表双向链表 栈(...

  • 关于LinkedList

    概念及特性 底层数据实现是双向链表数据结构,是无序列表,可以放相同元素 双向链表为链表结构的子数据结构,每个节点有...

  • 总结

    Android篇 数据结构与算法顺序表 - ArrayList源码链表 - 单向链表、双向链表 - LinkedL...

网友评论

    本文标题:数据结构 — 双向链表

    本文链接:https://www.haomeiwen.com/subject/cqyiprtx.html