复制链表的构造函数

时间:2018-07-10 02:41:28

标签: c++

我的链表类的副本构造函数遇到问题。 函数正常工作,但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;
}

}

1 个答案:

答案 0 :(得分:3)

该代码沿错误的方向插入新节点。您正在从头到尾遍历源列表(应该如此),但是您试图以从后到前的顺序将节点插入到目标列表中。但是,您根本不会分配head,并且在分配lastNode指向一个节点之前就可以访问它。更糟糕的是,即使您正确地分配了headlastNode,当您执行以下操作时,也不会将每个新节点都更新为指向先前的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;
    }
}