簡體   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