持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
什么是链表
链表是一个动态的数据结构,没有扩容的操作;链表的意义在于:从开头Head每个链表都会有一个数据Data,还有一个指针Next它指向另外一个对象,另外一个对象也是这两个对象,往下推--直到最后一个数据只有一个Data,没有指针。
链表和数组的区别
数组是一个静态的数据结构,新建好之后,它的内存就已经固定好了,它的优点是可根据索引(下标)精准的查到数据,这是数组在内存中连续存储的特性。
如果把某一个数据删掉,删掉后会多出一个空位,所以删除数据后面的所有数据都会往前补一位,如果是增加一位(插入一位),则需要先扩容,在扩容位置后面的所有数据则需要往后移一位
所以它的新增和删除复杂度较高,这是数组的特性所决定的
链表新增数据
链表的数据结构,在JavaScript中是没有自带的,需要去模拟链表的过程,比如新建一个函数function和类Class
class NodeList{
constructor(){}
}
新建Node类,这里接收每个传入的链表数据,在内接收它的数据data和指针next
class Node{
constructor(data,next){
this.data = data
this.next = null
}
}
在constructor中设置链表的相关操作,增删改查,设置它的头部和总长度这样就不用单独设置数量。
class NodeList{
constructor(){
this.head = null
this.length = 0
}
}
- 增加
增加需要新建节点信息,并且需要判断是否为空,如果为空则将新建
Node信息传给Head头部,如果不是则遍历链表指针,证明它是有数据
append(data){
let node = new Node(data)
let cur;
if(this.head == null){
this.head = node
}else{
cur = head
while(cur.next){
cur = cur.next
}
cur.next = node
}
this.length += 1
}
最后把链表指针进行赋值操作,遍历到最后为Null时,则把指针指向为Node新建节点信息,所有操作完成后,把总长度加一个长度,方便统计