繁体   English   中英

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

[英]Creating a deep copy of a doubly-linked list node

我的节点定义如下:

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)链接到该节点的任何内容。

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

您犯了一个错误,即您试图从单个节点复制整个链/列表。 在列表节点的副本中执行该操作没有多大意义。 使复制ctor仅复制成员的值,而不递归。 复制整个链/列表是LinkedList类的工作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM