复制构造函数不适用于链表?

Copy Constructor is not working for linked list?

下面是class的节点结构,链表拷贝构造函数,还有我的主文件。它正在打印第一个列表中的数字,它只将第一个数字 (15) 复制到第二个列表中。它调用两个列表的析构函数,程序正确关闭。无论我多么努力,我都无法弄清楚这个复制构造函数,它真的开始困扰我了。

#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <iostream>
using namespace std;

// Declare a class for the list
class LinkedList
{
private:
    // Declaring a structure for the list
    struct ListNode
    {
        // Integer value in the node and pointer to the next node
        int value = NULL;
        struct ListNode* next = nullptr;
    };

    // List head pointer
    ListNode* head = nullptr;
public:
    // Constructor
    LinkedList() { head = nullptr; };

    // Copy constructor
    LinkedList(const LinkedList &);

    // Destructor
    virtual ~LinkedList();

    // Linked list operations
    void appendNode(int);
    void insertNode(int);
    void deleteNode(int);
    void printList() const;
    void reverseList() const;
    int searchList(const int) const;
};

#endif // LINKEDLIST_H

LinkedList::LinkedList(const LinkedList& listObj)
{
    ListNode* newNode = nullptr; // Create new node
    ListNode* copyPtr = nullptr; // Point to original object

    copyPtr = listObj.head;

    newNode = new ListNode;
    this->head = newNode;
    head->value = copyPtr->value;
    copyPtr = copyPtr->next;

    while(!copyPtr)
    {
        newNode->next = new ListNode;
        newNode = newNode->next;
        newNode->value = copyPtr->value;
        copyPtr = copyPtr->next;
    }
}

#include "LinkedList.h"
#include <iostream>
using namespace std;

int main()
{
    LinkedList list1;
    list1.appendNode(15);
    list1.appendNode(20);
    list1.appendNode(25);

    list1.printList();

    LinkedList list2 = list1;

    list2.printList();

    return 0;
}

你的循环条件不正确。您想在 下一个节点时循环。你做的恰恰相反:

while(!copyPtr)

应该是:

while (copyPtr) 

另请注意,如果您从中复制的列表为空,则您的复制构造函数将不正确。在进行任何检查之前取消引用 listObj.head

我发现您的代码有两个问题:

  1. 您没有检查 listObj 是否为 nullptr
  2. 在 while 循环结束时,您没有将 newNode->next 设置为 nullptr

谢谢大家的帮助!更改为 while(copyPtr) 使其工作。这么愚蠢的错误。非常感谢。

LinkedList::LinkedList(const LinkedList& listObj)
{
    ListNode* newNode = nullptr; // Create new node
    ListNode* copyPtr = nullptr; // Point to original object

    if(!listObj.head)
        return;
    else
    {
        copyPtr = listObj.head;

        newNode = new ListNode;
        this->head = newNode;
        head->value = copyPtr->value;
        copyPtr = copyPtr->next;

        while(copyPtr)
        {
            newNode->next = new ListNode;
            newNode = newNode->next;
            newNode->value = copyPtr->value;
            copyPtr = copyPtr->next;
            newNode->next = nullptr;
        }
    }
}