Copy List with Random Pointer
MediumHash TableLinked List
Solution
export class Node {
val: number;
next: Node | null;
random: Node | null;
constructor(val?: number, next?: Node, random?: Node) {
this.val = val === undefined ? 0 : val;
this.next = next === undefined ? null : next;
this.random = random === undefined ? null : random;
}
}
export function copyRandomList(head: Node | null): Node | null {
if (head === null) {
return null;
}
let currentNode: Node | null;
currentNode = head;
while (currentNode) {
const newNode: Node = new Node(currentNode.val);
newNode.next = currentNode.next;
currentNode.next = newNode;
currentNode = newNode.next;
}
currentNode = head;
while (currentNode) {
if (currentNode.next && currentNode.random) {
currentNode.next.random = currentNode.random.next;
}
currentNode = currentNode.next?.next ?? null;
}
const oldHead = head;
const newHead = head.next;
let oldCurrentNode: Node | null = oldHead;
let newCurrentNode: Node | null = newHead;
while (oldCurrentNode && newCurrentNode) {
oldCurrentNode.next = oldCurrentNode.next?.next ?? null;
oldCurrentNode = oldCurrentNode.next;
newCurrentNode.next = newCurrentNode.next?.next ?? null;
newCurrentNode = newCurrentNode.next;
}
return newHead;
}