Копировать список со случайным указателем - Копировать не указывать на - - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь решить приведенную ниже проблему:

Дан связанный список, так что каждый узел содержит дополнительный случайный указатель, который может указывать на любой узел в списке или на нуль.

Вернуть полную копию списка.

Связанный список представлен на входе / выходе как список из 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...