我的链表类的副本构造函数遇到问题。 函数正常工作,但Visual Studio调试器存在“滞后”,因此我可以假定该函数内部发生了不良情况。 我无法捕捉到错误,而且我也不知道逻辑上有什么问题。 这是代码:
Linked_List::Linked_List(const Linked_List & obj)
: head(nullptr)
{
Node * currrentNode = obj.head;
Node * lastNode = nullptr;
while (currrentNode != nullptr)
{
Node * newNode = new Node;
newNode->character = currrentNode->character;
if (head != nullptr)
{
head = newNode;
lastNode = head;
}
else
{
lastNode->next = newNode;
lastNode = newNode;
}
currrentNode = currrentNode->next;
}
}
答案 0 :(得分:3)
该代码沿错误的方向插入新节点。您正在从头到尾遍历源列表(应该如此),但是您试图以从后到前的顺序将节点插入到目标列表中。但是,您根本不会分配head
,并且在分配lastNode
指向一个节点之前就可以访问它。更糟糕的是,即使您正确地分配了head
和lastNode
,当您执行以下操作时,也不会将每个新节点都更新为指向先前的head
节点作为其next
节点用新节点替换当前的head
。因此,您的目标列表仍将格式错误,并会泄漏内存。
代码应该以从前到后的顺序插入新节点:
Linked_List::Linked_List(const Linked_List & obj)
: head(nullptr)
{
Node * currentNode = obj.head;
Node * lastNode = nullptr;
while (currentNode)
{
Node * newNode = new Node;
newNode->character = currentNode->character;
if (lastNode)
lastNode->next = newNode;
else
head = newNode;
lastNode = newNode;
currentNode = currentNode->next;
}
}
可以简化为:
Linked_List::Linked_List(const Linked_List & obj)
: head(nullptr)
{
Node * currentNode = obj.head;
Node ** newNode = &head;
while (currentNode)
{
*newNode = new Node;
(*newNode)->character = currentNode->character;
newNode = &(newNode->next);
currentNode = currentNode->next;
}
}