2

我的节点定义如下:

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 等,直到出现堆栈溢出或内存错误。这可以通过仅实例化下一个(或上一个)的新副本来解决,但是之前(或下一个)链接到该节点的任何内容都不会被复制。

有没有复制双向链表节点的好方法?

4

2 回答 2

4

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

于 2011-02-24T20:30:50.047 回答
0

只需将 next 和 prev 设置为 null,而不管被复制节点的 next 和 prev 值。编写一个单独的函数来复制节点及其所有子节点,该函数将用于复制整个列表。

于 2011-02-24T20:30:48.447 回答