我是 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/