JS的数据结构笔记

2021-8-25 22:55:55

#javascript

18

前言

本文用于复习基本的数据结构 说起来有点丢人😂,大一大二学的数据结构现在已经有好多忘了,而且当时是使用C语言学习的,因此复习一波,用JavaScript这门语言全部实现一遍,重拾数据结构。

正文

数组

let a = []

与C语言类似,但封装更好,自带扩容,不用像C语言还要分配内存空间。

let a = []
a.pop()  // 出栈
a.push()  // 入栈

也被封装过,自带的api很好用。

队列

let a = []
a.shift()  // 出队,删除第一个元素并返回
a.push()  // 入队

另外值得一提的是unshift这个api,用于往数组首部塞元素,和shift正相反。

链表

// Node节点的实现
class Node {
  constructor(val) {
    this.val = val  //节点数据
    this.prev = null  //前一个链表指针
    this.next = null  //后一个链表指针
  }
}
class LinkList {
  constructor() {
    this.size = 0 //链表长度
    this.head = new Node()  //表头节点
  }
  //获取最后一个节点
  findLast() {
    let curNode = this.head
    while (curNode.next) {
      curNode = curNode.next
    }
    return curNode
  }
  //查找节点
  find(val) {
    let curNode = this.head
    while (curNode.next) {
      if (curNode.val === val)
        return curNode
      curNode = curNode.next
    }
    return null;  //查找不到返回null
  }
  //尾部增加节点
  append(val) {
    let newNode = new Node(val)
    let lastNode = this.findLast()
    lastNode.next = newNode
    newNode.prev = lastNode
    this.size++
  }
  //删除节点
  deleteNode(val) {
    let item = this.find(val)
    if (!item) {
      return false //查找不到返回false
    }
    //删除头结点
    if (item.prev == null)
      this.head = this.head.next
    //删除节点
    else
      item.prev = item.next
    this.size--
    return true
  }
  // 在某节点node后插入新节点val
  insert(node, val) {
    let item = find(node)
    if (!item) {
      return false
    }
    let newNode = new Node(val)
    item.next.prev = newNode
    newNode.next = item.next
    item.next = newNode
    newNode.prev = item
    return true
  }
}


待更新