📅  最后修改于: 2023-12-03 15:11:16.254000             🧑  作者: Mango
在本文中,我将介绍 JavaScript 中用于克隆具有 next 和随机指针的链表的程序。这个程序能够在 O(1) 的空间下完成链表的克隆。
从代码实现来看,我们需要使用一个哈希表来存储每个节点的克隆节点,同时迭代原始链表。对于每个节点,我们需要检查它的 Next 和 Random 指针是否存在。如果存在,我们在哈希表中查找对应的节克隆点,然后更新当前节点的克隆节点的 Next 和 Random 指针。
具体步骤:
下面是用于在 O(1) 空间中克隆具有 Next 和随机指针的链表的 Javascript 程序的代码实现。
function cloneLinkedList(head) {
if (!head) {
return null;
}
const map = new Map();
let current = head;
while (current) {
if (!map.has(current)) {
map.set(current, { val: current.val });
}
const cloneNode = map.get(current);
if (current.next) {
if (!map.has(current.next)) {
map.set(current.next, { val: current.next.val });
}
cloneNode.next = map.get(current.next);
}
if (current.random) {
if (!map.has(current.random)) {
map.set(current.random, { val: current.random.val });
}
cloneNode.random = map.get(current.random);
}
current = current.next;
}
return map.get(head);
}
请注意,这个程序使用了 Map 数据结构,因此需要在现代浏览器中运行,或者在 Node.js 中运行时需要使用 --harmony 或 --harmony-map 进行启动。
我们可以使用以下测试用例来测试这个程序:
const head = {
val: 1,
next: { val: 2, next: { val: 3, next: null, random: null }, random: null },
random: { val: 3, next: null, random: null },
};
const cloneHead = cloneLinkedList(head);
console.log(cloneHead); // { val: 1, next: { val: 2, next: { val: 3, next: null, random: null }, random: null }, random: { val: 3, next: null, random: null } }
输出应该为:
{ val: 1, next: { val: 2, next: { val: 3, next: null, random: null }, random: null }, random: { val: 3, next: null, random: null } }
在本文中,我们介绍了如何在 Javascript 中用于在 O(1) 空间中克隆具有 Next 和随机指针的链表的程序。这个程序使用哈希表存储每个节点的克隆节点,以避免使用额外的空间。