创建双向链表节点的深层副本

时间:2011-02-24 20:25:13

标签: c++ c++11 linked-list deep-copy

我的节点定义如下:

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)的新副本来修复,但之后(或下一个)与此节点无关的任何内容都将被复制。

是否有一种复制双向链表节点的好方法?

2 个答案:

答案 0 :(得分:4)

您正在尝试从单个节点复制整个链/列表。这在列表节点的copy ctor中没有多大意义。使复制ctor只复制成员的值,不要递归。复制整个链/列表是LinkedList类的工作。

答案 1 :(得分:0)

只需将next和prev设置为null,无论正在复制的节点的next和prev值如何。编写一个单独的函数,复制节点及其所有子节点,用于复制整个列表。