[英]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.