链表中数据单位的名称叫做“结点”,结点和结点的分布在内存中可以是离散的。
相对于数组来说,链表添加和删除元素都不需要挪动多余的元素
-
高效的增删
明确插入/删除的目标位置,只需要改变目标结点及其前驱/后继结点的指针指向
-
麻烦的访问
试图读取某一个特定的链表结点时,必须遍历整个链表来查找它
在数组中直接访问索引可以做到一步到位
{
// 数据域`
val: 1,
// 指针域,指向下一个结点`
next: {
val:2,
next: ...
} }
创建链表
function ListNode(val) {
this.val = val;
this.next = null;
}
const node = new ListNode(1)
node.next = new ListNode(2)
修改元素
新增
假如要把 node3 添加到 node2 所在链表的尾部,直接把 node2 的 next 指针指向 node3 即可
插入
// 如果目标结点本来不存在,那么记得手动创建
const node3 = new
ListNode(3)
// 把node3的 next 指针指向 node2(即 node1.next)
node3.next = node1.next
// 把node1的 next 指针指向 node3
node1.next = node3
删除
要想遍历不到 node3,直接让它的前驱结点 node1 的 next 指针跳过它、指向 node3 的后继即可
node1.next = node3.next
链表的插入/删除效率较高,而访问效率较低;
数组的访问效率较高,而插入效率较低