目录
- 1. 数组
- 1.1 数组创建
- 1.2 数组遍历
- 1.3 二维数组
- 1.4 增加元素的方法
- 1.5 删除元素的方法
- 2. 栈
- 3. 队列
- 4. 链表
- 4.1 链表节点创建
- 4.2 添加链表元素
- 4.3 删除链表元素
- 5. 树
- 5.1 创建二叉树
我们需要掌握的数据结构主要有:
数组、栈、队列、链表、树,下面就一一来总结这几种数据结构。
1. 数组
1.1 数组创建
我们经常创建数组的方式是:
const arr =[1,2,3]
不过我们在创建数组时,有时不知道内部情况,就可以用构造函数方式来创建数组:
const arr = new Array() // 等价于 const arr = []
//我们可以给它传一个参数,作为数组长度
const arr1 = new Array(10)
1.2 数组遍历
(1)for循环
注意:for
循环的效率最高,能用for
循环就用for
循环。
const len =arr.length
for (let i = 0; i<len; i++){
console.log(i,arr[i])
}
(2)forEach方法
arr.forEach((item,index)=>{
console.log(index,item)
}
(3)map方法
注意:map
方法会返回一个全新的数组,不会改变原数组。所以map
方法的作用就不仅仅是遍历数组,而是在遍历的基础上对数组进行处理。
const newArr = arr.map((item,index)=>{
console.log(index,item)
return item*2 //所有元素乘以2
}
1.3 二维数组
(1)二维数组:
const arr = [
[1,2,3],
[1,2,3],
[1,2,3]
]
(2)二维数组初始化
const len = arr.length
for(let i=0;i<len;i++) {
arr[i] = []
}
(3)二维数组访问
// 缓存外部数组的长度
const len1 = arr.length
for(let i=0; i<len1; i++) {
const len2 = arr[i].length
for(let j=0; j<len2; j++) {
console.log(i,j,arr[i][j]) //输出二维数组的索引值和数组值
}
}
1.4 增加元素的方法
(1)unshift
方法:添加元素到数组的头部
const arr = [1,2]
arr.unshift(0) // [0,1,2]
(2)push
方法:添加元素到数组的尾部
const arr = [1,2]
arr.push(3) // [1,2,3]
(3)splice
方法:添加元素到数组的任何位置
注意:第一个参数为开始删除元素的其实位置,第二个参数是删除元素个数,第三个参数是要替换元素。
const arr = [1,2]
arr.splice(1,0,3) // [1,3,2]
1.5 删除元素的方法
(1)shift
方法:删除数组头部的元素
const arr = [1,2,3]
arr.shift() // [2,3]
(2)pop
方法:删除数组尾部的元素
const arr = [1,2,3]
arr.pop() // [1,2]
(3)splice
方法:删除数组任意位置的元素
const arr = [1,2,3]
arr.splice(1,2) // [1]
2. 栈
- 在JavaScript中,栈和队列的实现一般会依赖数组,可以看做是一种特殊的数组。
- 栈是一种后进先出的数据结构,只能从尾部添加和删除元素,添加元素使用
push
方法,删除元素使用pop
方法。 - 面试题经常有关于取栈顶元素的操作:
const stack = []
stack.push(1)
stack.push(2)
stack.push(3)
while (stack.length){
const top = stack[stack.length-1]
console.log(top) // 栈顶元素
stack.pop() // 删除栈顶元素,该方法返回删除的元素
}
3. 队列
- 队列是一种先进先出的数据结构,只能从尾部添加元素,在头部删除数据。添加元素使用
shift
方法,删除数据使用push
方法。
const queue = []
queue.push(1)
queue.push(2)
queue.push(3)
while(queue.length) {
const top = queue[0]
console.log(top) //队头元素
queue.shift() // 删除队头元素,该方法返回删除的元素
}
4. 链表
链表是线性结构,是一种有序的列表。在链表中,每个节点都有数据域和指针域,JavaScript中的链表是以嵌套对象的形式来实现的。
{
// 数据域
val: 1,
// 指针域,指向下一个结点
next: {
val:2,
next: {
val:3,
}
}
}
4.1 链表节点创建
我们用构造函数来创建列表的节点:
function ListNode(val) {
this.val = val;
this.next = null;
}
//创建节点
const node = new ListNode(1)
node.next = new ListNode(2)
4.2 添加链表元素
链表添加元素主要是操作元素的指针域next
:
//原来链表是1->2, 我们在它们之间添加3,即:1->3->2
const node3 = new ListNode(3)
node3.next = node1.next
node1.next =
4.3 删除链表元素
链表删除元素主要也是操作元素的指针域next
:
//原来链表1->3->2,我们删除3,即:1->2
node1.next = node3.next
5. 树
这里我们主要来说树中的二叉树,二叉树要满足以下两个要求:
- 如果一个二叉树没有根节点,则该树为空树
- 如果不是空树,就要有根节点,左子树,右子树,并且左右子树都是二叉树
在JavaScript中,二叉树使用对象来表示,它主要有三部分:数据域、左子树根节点的引用,右子树根节点的引用。
5.1 创建二叉树
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
// 创建节点
const node = new TreeNode(1) // 创建出来一个左右子树为null,值为1的节点