前言
本文用于复习基本的数据结构 说起来有点丢人😂,大一大二学的数据结构现在已经有好多忘了,而且当时是使用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
}
}
树
待更新