Сложность: medium
Дан связный список длиной n, в котором каждый узел содержит дополнительный случайный указатель (random pointer), который может указывать на любой узел в списке или быть равным null.
Создайте глубокую копию списка. Глубокая копия должна состоять из ровно n совершенно новых узлов, где каждый новый узел имеет значение, равное значению соответствующего оригинального узла. Указатели next и random новых узлов должны указывать на новые узлы в скопированном списке таким образом, чтобы указатели в оригинальном и скопированном списке представляли одно и то же состояние списка. Ни один из указателей в новом списке не должен указывать на узлы в оригинальном списке.
Пример:
Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]
👨💻 Алгоритм:
1⃣Инициализация и начало обхода:
Начните обход графа со стартового узла (head). Создайте словарь visited_dictionary для отслеживания посещенных и клонированных узлов.
2⃣Проверка и клонирование узлов:
Для каждого текущего узла (current_node) проверьте, есть ли уже клонированная копия в visited_dictionary.
Если клонированная копия существует, используйте ссылку на этот клонированный узел.
Если клонированной копии нет, создайте новый узел (cloned_node_for_current_node), инициализируйте его и добавьте в visited_dictionary, где ключом будет current_node, а значением — созданный клон.
3⃣Рекурсивные вызовы для обработки связей:
Сделайте два рекурсивных вызова для каждого узла: один используя указатель random, другой — указатель next.
Эти вызовы отражают обработку "детей" текущего узла в терминах графа, где детьми являются узлы, на которые указывают указатели random и next.
😎 Решение:
class Node {
public $val;
public $next;
public $random;
public function __construct($val, $next = null, $random = null) {
$this->val = $val;
$this->next = $next;
$this->random = $random;
}
}
function copyRandomList($head) {
$visitedHash = [];
function cloneNode($node) use (&$visitedHash, &$cloneNode) {
if ($node === null) {
return null;
}
if (array_key_exists(spl_object_id($node), $visitedHash)) {
return $visitedHash[spl_object_id($node)];
}
$newNode = new Node($node->val);
$visitedHash[spl_object_id($node)] = $newNode;
$newNode->next = $cloneNode($node->next);
$newNode->random = $cloneNode($node->random);
return $newNode;
}
return cloneNode($head);
}Ставь 👍 и забирай 📚 Базу знаний
