Создание глубокой копии узла двусвязного списка - PullRequest
2 голосов
/ 24 февраля 2011

Я определил что-то вроде моего узла:

class LLNode
{
public:
    std::shared_ptr<LLNode> prev;
    std::shared_ptr<LLNode> next;
    std::shared_ptr<int> data;
    LLNode(void)
    : prev(std::shared_ptr<LLNode>(nullptr)),
    next(std::shared_ptr<LLNode>(nullptr)),
    data(std::shared_ptr<int>(nullptr))
    {
    }

    LLNode(const LLNode &node)
    : prev(std::shared_ptr<LLNode>(node.prev == nullptr?nullptr:new LLNode(node.prev))),
    next(std::shared_ptr<LLNode>(node.next == nullptr?nullptr:new LLNode(node.next))),
    data(std::shared_ptr<int>(new int(node.data)))
    {
    }
};

Однако, если у меня есть узел, который связан с другим узлом (что, очевидно, часто имеет место), копирующий узел A будет создавать экземпляр копии следующего узла B, который, в свою очередь, будет пытаться создать копию узла. A, который будет пытаться скопировать узел B и т. Д. До тех пор, пока не возникнет переполнение стека или ошибка памяти. Это можно исправить, только создав экземпляр новой копии next (или prev), но тогда ничто, связанное ранее (или next) с этим узлом, не будет скопировано.

Есть ли хороший способ скопировать двусвязный узел списка?

Ответы [ 2 ]

4 голосов
/ 24 февраля 2011

Вы делаете ошибку, пытаясь скопировать всю цепочку / список из одного узла. Это не имеет особого смысла в копировании ctor узла списка. Сделайте копию ctor, просто скопируйте значения членов, не повторяйте. Копирование всей цепочки / списка - это задание для класса LinkedList.

0 голосов
/ 24 февраля 2011

Просто установите next и prev в null, независимо от следующих и prev значений копируемого узла. Напишите отдельную функцию, которая копирует узел и все его дочерние элементы, который будет использоваться для копирования всего списка.

...