共计 1271 个字符,预计需要花费 4 分钟才能阅读完成。
链表
链表是一种物理存储单元上非间断、非程序的存储构造,数据元素的逻辑程序是通过链表中的指针链接秩序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点能够在运行时动静生成。每个结点包含两个局部:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。【起源百度百科】
链表特点
- 用一组任意的内存空间去存储数据元素(这里的内存空间能够是间断的,也能够是不间断的)
- 每个节点 (node) 都由数据自身和一个指向后续节点的指针组成
- 整个链表的存取必须从头指针开始,头指针指向第一个节点
- 最初一个节点的指针指向空(NULL)
JS 中并没有指针,上述节点的指针只是借用的 C 语言中的概念。
链表复杂度
工夫复杂度
Access | Search | Insertion | Deletion | |
---|---|---|---|---|
O(n) | O(n) | O(1) | O(1) |
空间复杂度
O(n)
单向链表的实现
链表中的几个次要操作
- 初始化链表 / 节点
- 头部插入节点
- 搜寻 / 遍历节点
- 删除节点
- …
初始化链表中的节点
class LinkedListNode {constructor(value, next = null) {
this.value = value;
this.next = next; // 初始化为 null
}
}
初始化单向链表
class LinkedList {constructor() {
// 初始空指针
this.head = null;
}
}
头部追加节点(append)
append(value) {
// 新建节点
const newNode = new LinkedListNode(value, this.head);
// 将值赋予 head 为了下次新建
this.head = newNode;
}
删除节点
delete(value) {
// 如果不存在节点 return null
if (!this.head) {return null;}
// 如果删除的是第一个节点
let deletedNode = null;
// 如果删除的第一个元素
while (this.head && this.head.value === value) {
deletedNode = this.head;
this.head = this.head.next;
}
// 非第一个节点, 遍历查找
let currentNode = this.head;
if (currentNode !== null) {while (currentNode.next) {if (currentNode.next.value === value) {
deletedNode = currentNode.next;
currentNode.next = currentNode.next.next;
} else {currentNode = currentNode.next;}
}
}
return deletedNode;
}
结语
做个简略总结, 链表构造简略了解就是一个节点外面 蕴含以后 value, 以及下个 next。而后初始化就是一个 head。同样的构造顺次去追加。了解的话会感觉很简略, 当然链表远不止这些, 还有双向链表, 操作还有链表反转(reverse), 删除(头, 尾), 转换数据结构等等。
下期见。
其余链接
上述示例代码仓库
正文完
发表至: javascript
2021-07-22