研习算法(续二)-链表实现(javascript版)

240 阅读1分钟

链表简介

  • 多个元素组成的列表
  • 元素存储不连续,用next指针连在一起

双向链表

  • 追加 (push) - O(1)
  • 索引 访问/修改(A[idx]=...)- O(n)
  • 插入(insert) - O(1)
  • 删除(delete/remove) - O(1)
  • 合并 - O(1)

单向链表 (先简单说明下)

  • 头指针-指向链表的第一个节点
  • 链表节点包括key和next指针
    • key 可以是数据或卫星数据的地址
    • next 指针指向下一个链表节点

节点内部

image.png

程序表示

image.png

向空链表中插入元素

  1. 创建一个空链表,HEAD指针指向null const list = new LinkedList()

image.png 2. 创建一个包含数据1的节点 const node = new ListNode(1)

image.png 3. 将HEAD 指针指向节点 list.head = node

image.png 4. 在数据节点1 插入数据节点2

  • 创建一个包含数据2的节点 const node2 = new ListNode(2)

image.png

  • 将节点2的next指针指向节点1 node2.next = node

image.png

  • 调整HEAD指针指向节点2 list.head = node2

image.png

插入方法

image.png

在链表中查找节点 O(n)

image.png

已知节点2,删除节点2

image.png

双向链表

image.png

程序表示

image.png

双向链表删除元素2

image.png

image.png

image.png

其他问题

  • 双向链表的插入 - O(1)
  • 双向链表的索引 - O(n)
  • 双向链表的合并 - O(m + n)