提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Js实现链表
前言
链表是一直非常基础的数据结构,想学习数据结构知识,我们必须要了解的
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用步骤
1.链表是什么?
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表主要是便于管理长度或数量不确定的数据,相对于数组,链表处理这种数据时比较节省内存。动态语言通常不大需要链表,因为动态语言的解释器帮你管理内存,但当你对空间效率或插入动作的效率有特殊要求时也可在动态语言中使用链表。
2.链表的特征
1,数据是逐渐增加的
2,数据是不定长的,在存储第一个数据之前难以确定一个将来一共需要存储多少数据的上限,或者虽然可以确定上限,但这个上限又比通常大部分情况下数据可能达到的长度要大得多,因而一次性按照上限把空间分配好是不划算的。而链表则可以在每次需要增加新数据时才为之申请内存,不会造成浪费,也不会因一次申请不足而使数据的数量受到限制。
3,不需要按照序号对数据进行随机访问。C++ STL 中提供了list容器,就是链表。同时STL还提供了vector容器,也可以用于处理具有上述特点的数据,而且vector还支持随机访问(即可以不考虑上述第3点要求)。但vector在增加数据时,如果原先分配的连续内存已经用完则需要重新分配内存并把原有数据复制过去,这时它的插入数据的动作时间复杂度就不是O(1)了(不是常量时间了)。因而,链表适于处理的数据除了具有上述特点外,如果还有如下第4点特征,则以链表为最佳选择了:
4,希望每次添加数据、删除数据的动作的时间复杂度都是O(1)的(常量时间)。
3.上代码
实现一个Node结点:
class Node {
constructor(value) {
this.item = value;
this.next = null
}
}
实现链表主体:
class Line {
constructor() {
this.header = {
next: null
};
this.length = 0
}
//尾部插入
append(element) {
const node = new Node(element)
if (this.isEmpty()) {
this.header.next = node
} else {
let LastNode = this.header.next
while (LastNode.next != null) {
LastNode = LastNode.next
}
LastNode.next = node
}
this.length += 1
}
//任意位置插入
insert(position, element) {
if (position < 0 || position > this.size()) {
console.log('插入位置失败!')
return
}
const node = new Node(element)
let insertNode = this.header
while (position > 0) {
insertNode = insertNode.next
position--
}
//开始插入
node.next = insertNode.next
insertNode.next = node
this.length += 1
}
//任意位置删除
deleteAt(position) {
if (position < 0 || position > this.size()) {
console.log('删除位置失败!')
return
}
let deleteNode = this.header
while (position > 0) {
deleteNode = deleteNode.next
position--
}
const deleteNextNode = deleteNode.next
deleteNode.next = deleteNextNode.next
this.length -= 1
}
delete() {
}
//是否是空链表
isEmpty() {
if (this.length === 0) {
return true
} else {
return false
}
}
//链表的长度
size() {
return this.length
}
//链表的数据
toValue() {
return this.header
}
}
测试代码
const line = new Line()
const elements = ['hello', 'world']
elements.forEach((element) => {
line.append(element)
})
line.insert(0, 'zg')
line.append("isOk")
line.deleteAt(0)
console.log("line", line.size(), line.toValue())
总结
提示:链表是非常重要的数据结构,在大量执行插入和删除操作的情况下,使用链表的效率比数组更高哦。