数组转链表,易懂版
function array2list(ary) {
if(ary.length === 0) {
return null
}
var nodes = []
for(var i = 0; i < ary.length; i++) {
var node = {}
node.value = ary[i]
node.next = null
nodes.push(node)
}
for(var i = 0; i < nodes.length - 1; i++) {
nodes[i].next = nodes[i + 1]
}
return nodes[0]
}
数组转链表,不占用额外空间版
function array2list(ary) {
if(!ary.length) {
return null
}
var node
var head = {value: ary[0], next: null}
var pnode = head
for(var i = 1; i < ary.length; i++) {
node = {value: ary[i], next:null}
pnode.next = node
pnode = node
}
return head
}
数组转链表,递归版,占用的栈空间为O(n)。
function array2list(ary, start = 0) {
if(start === ary.length) {
return null
}
var node = {
value: ary[start],
next: null
}
var rest = array2list(ary, start + 1)
node.next = rest
return node
}
链表转数组,易懂版。
function list2array(head) {
if(!head) {
return []
}
var result = []
var p = head
while(p) {
result.push(p.value)
p = p.next
}
return result
}
链表转数组,递归版
function list2array(head) {
if(!head) {
return []
}
var result = [head.value]
var restValues = list2array(head.next)
return result.concat(restValues)
}
链表与数组的区别
数组是连续存储的,而链表不是连续存储的。
数组可以随机访问,而链表不能,查找只能顺着链子遍历下去。
数组的插入操作为O(n),而链表的插入操作为O(1)。