开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情
链表的概念及结构
定义:
链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。 复制代码
特点:
链表由一系列节点(链表中每一个元素称为节点)组成,节点在运行时动态生成 (malloc),每个节点包括两个部分: 一个是存储数据元素的数据域 另一个是存储下一个节点地址的指针域 复制代码
链表 链表
由对象构成,每个对象都有一个头和一个下一个值。
网络异常,图片无法展示
|
* *javascript 中的链表看起来像这样
**
const list = { head: { value: 1 next: { value: 20 next: { value: 22 next: { value: 21 next: null } } } } } }; 复制代码
链表节点分为两个域
数据域:存放各种实际的数据,如:num、score等
指针域:存放下一节点的首地址,如:next等.
链表的一些缺点如下。
- 它比较慢,因为不允许像在数组中那样进行随机访问。
- 由于指针的存储,它使用更多的内存
创建一个 javascript 类作为 ListNode
class ListNode{ constructor(data){ this.data = data this.next = null } } 复制代码
将 javascript 类创建为链表
class LinkedList{ constructor(head = null){ this.head = head } } 复制代码
**现在我们将它们放在一起
**
我们将 创建两个列表节点,然后创建一个从节点 1 到节点 2 的指针
let node1 = new ListNode(2) let node2 = new ListNode(5) node1.next = node2 复制代码
如果我们分解代码,我们会看到在第一行我们将 node1 定义为一个新的 listNode(2),其中 2 是我们分配给 node1 的值,然后我们在第二行做同样的事情。
然而,在第三行,我们定义了 node1 指针的值,我们告诉它等于 node2。
现在我们将使用 node1 创建一个链表
let list = new LinkedList(node1) 复制代码
这里我们将 list 定义为链表,并为其分配 node1 值。
让我们尝试访问它。
console.log(list.head.next.data) 复制代码
它将返回 5,但为什么呢?
让我们看看,当我们访问list.head.next时,我们告诉它去下一个节点,最后一个数据是访问我们在 linkedList 中时的数据。