Я пытаюсь решить приведенную ниже проблему:
Дан связанный список, так что каждый узел содержит дополнительный случайный указатель, который может указывать на любой узел в списке или на нуль.
Вернуть полную копию списка.
Связанный список представлен на входе / выходе как список из n узлов. Каждый узел представлен как пара [val, random_index], где:
val: целое число, представляющее Node.val random_index: индекс узла (от 0 до n-1), где случайный указатель указывает на , или null, если он не указывает на какой-либо узел.
Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]
Моя идея была l oop головой и создать новый узел с тем же значением и установить его для моего ans Node. Это будет копия, потому что я создаю новую. Затем я снова oop ищу случайный указатель, который ищет в моем узле ans узел со значением, на которое я должен указать. Он отлично работает для ввода выше. Однако, если у меня есть вход с повторяющимися значениями, метод findeNode может вернуть недопустимый узел. Например, он не работает для ввода ниже:
[[3,null],[5,17],[4,null],[-9,6],[-10,3],[5,15],[0,11],[6,null],[-6,16],[3,16],[-6,11],[9,12],[-2,1],[-3,11],[-1,10],[2,11],[-3,null],[-9,7],[-2,4],[-8,null],[5,null]]
Мой вывод:
[[3,null],[5,3],[4,null],[-9,null],[-10,3],[5,15],[0,11],[6,null],[-6,13],[3,13],[-6,11],[9,12],[-2,1],[-3,11],[-1,8],[2,11],[-3,null],[-9,7],[-2,4],[-8,null],[5,null]]
Правильный вывод:
[[3,null],[5,17],[4,null],[-9,6],[-10,3],[5,15],[0,11],[6,null],[-6,16],[3,16],[-6,11],[9,12],[-2,1],[-3,11],[-1,10],[2,11],[-3,null],[-9,7],[-2,4],[-8,null],[5,null]]
Определение узла:
function Node(val, next, random) {
this.val = val;
this.next = next;
this.random = random;
};
Мой код:
var copyRandomList = function(head) {
if(!head) return head;
let ans = new Node(0);
let temp = ans;
let cur = head;
while(cur) {
const node = new Node(cur.val);
temp.next = node;
cur = cur.next;
temp = temp.next;
}
cur = head;
temp = ans.next;
while(cur) {
const randomNode = cur.random;
if(!randomNode) {
temp.random = null;
} else {
const node = findNode(ans, randomNode.val);
temp.random = node;
}
cur = cur.next;
temp = temp.next;
}
return ans.next;
};
const findNode = (list, val) => {
if(!val)
return null;
while(list) {
if(list.val === val)
return list;
list = list.next;
}
return null;
}