深度复制链表的 C++ 构造函数

标签 c++ linked-list copy

我是 C++ 和一般编程的菜鸟,我正在尝试制作一个构造函数来复制一个链表。这个想法是我可以使用

 Individual* copyOfList = new Individual(originalList->getFirstBit());

对原始列表进行深度复制。

但是我下面的cose好像不是在做深拷贝。当我编辑 copyOfList 时,originalList 也会受到影响。而且我对链表的了解还不足以使其成为深拷贝。有人可以帮帮我吗。

Individual::Individual(BinaryNode * copyHead)
{
    head = copyHead;
    NodePtr last = NULL;
    NodePtr temp = NULL;
    curr = head;
    while (curr != NULL)
    {
        temp = new BinaryNode(curr->data, NULL);

        if (last != NULL)
        {
            last->next = temp;
        }

        last = temp;

        if (head == NULL)
        {
            head = temp;
        }

        curr = curr->next;
    }
}

这是二进制节点代码

class BinaryNode
{
public:
BinaryNode();
BinaryNode(bool the_data, BinaryNode *next_link);

bool data;
BinaryNode *next;
private:
}; 

这是原始列​​表代码。我认为我填充它的顺序正在添加到头部。

if(the_length > 0)
{
    srand(time(NULL));
    int randnumber;
    NodePtr temp = new BinaryNode;
    for(int i = 0; i < the_length; i++)
    {
        randnumber=(rand() % 2);
        temp = new BinaryNode(randnumber,head);
        head = temp;
    }
}

最佳答案

head = copyHead;

在上面的语句中,head 指向与copyHead 指向的同一内存位置。没有在空列表中输入循环。但是在循环中-

if (head == NULL)
{
    head = temp;
}

在要复制的具有子项的链表上永远不会出现这种情况。因此,您永远不会更新链表的 head,它仍然指向要复制的链表的起始节点。尝试-

Individual::Individual(BinaryNode * copyHead)
{
    if (NULL == copyHead)
    {
       // Empty list
       return;
    }

    head = new BinaryNode(copyHead->data, NULL);

    curr     = head;
    copyHead = copyHead->next;

    while (NULL != copyHead)
    {
        // Copy the child node
        curr->next     = new BinaryNode(copyHead->data, NULL);

        // Iterate to the next child element to be copied from.
        copyHead = copyHead->next;

        // Iterate to the next child element to be copied to.
        curr     = curr->next;
    }
}

希望对您有所帮助!

关于深度复制链表的 C++ 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18673709/

相关文章:

C++ - 基类指针、方法指针、引用派生类、方法?

c++ - 找到下一个回文

c - 连续内存空间中的链表

python - 使用python在S3中Redshift COPY csv

mysql - 我可以简单地复制/var/lib/mysql/中的mysql数据库文件夹来备份数据库吗?

java - 数组列表的浅拷贝

c++ - Eclipse CDT 语法错误但仍然可以编译

c++ - C/C++ : Conversion of char[] to int fails, unsigned char[] to int 有效,为什么?

java - 给定链表的成对交换元素(Java解决方案)

java - 如何在 Java 中按字母顺序将对象添加到链表中?