如果我想用这个初始数据创建一个linkedList
const linkedListData = {
linkedList: {
head: "1",
nodes: [
{ id: "1", next: "1-2", value: 1 },
{ id: "1-2", next: "1-3", value: 1 },
{ id: "1-3", next: "2", value: 1 },
{ id: "2", next: "3", value: 3 },
{ id: "3", next: "3-2", value: 4 },
{ id: "3-2", next: "3-3", value: 4 },
{ id: "3-3", next: "4", value: 4 },
{ id: "4", next: "5", value: 5 },
{ id: "5", next: "5-2", value: 6 },
{ id: "5-2", next: null, value: 6 },
],
},
};
但是linkedList的结果应该是
const linkedListDataV2 = {
value: 1,
next: {
value: 1,
next: {
value: 1,
next: {
value: 3,
},
next: {
value: 4,
next: {
value: 4,
next: {
value: 4,
next: {
value: 5,
next: {
value: 6,
next: {
value: 6,
next: null
}
}
}
}
}
}
}
}
}
是否有任何现有的算法可以在javascript中创建linkedList?原因是我正在尝试调试vs代码中的一些链接列表算法,但是我需要找到一种方法来轻松地创建一个链接列表,而不是手动创建它们。
发布于 2022-04-24 19:49:04
您可以获取一个对象,并将这些节点分配给实际节点和下一个节点。因此,根据头标识符获取列表。
这种方法也适用于未排序的数据。
const
linkedList = { head: "1", nodes: [{ id: "1", next: "1-2", value: 1 }, { id: "1-2", next: "1-3", value: 1 }, { id: "1-3", next: "2", value: 1 }, { id: "2", next: "3", value: 3 }, { id: "3", next: "3-2", value: 4 }, { id: "3-2", next: "3-3", value: 4 }, { id: "3-3", next: "4", value: 4 }, { id: "4", next: "5", value: 5 }, { id: "5", next: "5-2", value: 6 }, { id: "5-2", next: null, value: 6 }] },
list = linkedList.nodes.reduce((r, { id, next, value }) => {
r[id] ??= {};
r[id].value = value;
r[id].next = r[next] ??= {};
return r;
}, {})[linkedList.head];
console.log(list);
.as-console-wrapper { max-height: 100% !important; top: 0; }
发布于 2022-04-24 20:01:08
循环版本(而不是使用reduce
)。在精神上与妮娜的回答相似,而且可能更容易理解。
const linkedListData = {
linkedList: {
head: "1",
nodes: [
{ id: "1", next: "1-2", value: 1 },
{ id: "1-2", next: "1-3", value: 1 },
{ id: "1-3", next: "2", value: 1 },
{ id: "2", next: "3", value: 3 },
{ id: "3", next: "3-2", value: 4 },
{ id: "3-2", next: "3-3", value: 4 },
{ id: "3-3", next: "4", value: 4 },
{ id: "4", next: "5", value: 5 },
{ id: "5", next: "5-2", value: 6 },
{ id: "5-2", next: null, value: 6 },
],
},
};
function nodesToList(nodes, headId) {
// maps id -> {next: nextId, value: value}
const byId = new Map(nodes.map(
n => [n.id, {value: n.value, next: n.next}]));
// maps id -> {next: node, value: value}
for (let n of byId.values()) {
n.next = n.next == null ? null : byId.get(n.next);
}
// and now, just return the head
return byId.get(headId)
}
console.log(nodesToList(
linkedListData.linkedList.nodes,
linkedListData.linkedList.head));
https://stackoverflow.com/questions/71991740
复制相似问题