链表基本概念

119 阅读1分钟

一、数组和链表的区别

数组在内存中占据连续的内存空间,遍历通过索引访问对应的元素

链表在内存中是分散的,拥有数据域val和指针域next,指针域中存放着下一个后继节点的内存地址,遍历从起始结点开始,逐个访问next。

1.创建链表

es5的写法,用构造器创建对象,参数val,给指针赋值为null

function ListNode(val) {
    this.val = val
    this.next = null
}

const node1 = new ListNode(1)
const node2 = new ListNode(2)
node1.next = node2

2.在链表中间添加元素

比如上面1的node1 -> node2, 现在想在中间插入node3,形成node1 -> node3 -> node2

const node3 = new ListNode(3)
node3.next = node1.next
node1.next = node3

3.链表删除元素

使用上面2中的node1 -> node3 -> node2,现在想删除元素node3

node1.next = node1.next.next
node1.next.next = null

从上面可以看出,删除目标结点真正需要定位的是目标结点的前驱结点

二、js中的数组

1.如果数组中定义的是基本数据类型,那么在内存中占据的是一片连续的内存 2.如果数组中定义了对象,那么在内存中就不连续了,底层使用hash映射分配内存空间,是由对象链表实现的

1.访问链表

比如要访问第10的元素

// 在普通数组中:arr[9]

在链表中
let node = head
for (let i = 0; i < index && node; i ++){
    node = node.next)
}