链表深度复制构造函数

Linked list deep copy constructor

本文关键字:构造函数 复制 深度 链表      更新时间:2023-10-16

我正在实现一个链表类的复制构造函数,它将进行深度复制。这是我的代码:

List( const List & rhs ) {
        Node* rhsFront = rhs.header->next;
        Node* prev = header;
        while (rhsFront) {
            prev->next = new Node(rhsFront->data, nullptr);
            rhsFront = rhsFront->next;
            prev = prev->next;
        }
}

但是,它在这一行崩溃了:

prev->next = new Node(rhsFront->data, nullptr);

我做错了什么?

Node* prev = header;

我猜那里的头没有被初始化,因此导致prev->旁边是一个随机指针(很可能是0之类的东西),试图写到那个点会导致程序崩溃。如果是这样,这可能有效。

List( const List & rhs ) {
    Node* rhsFront = rhs.header->next;
    header = new Node(rhs.header->data, nullptr);
    Node* prev = header;
    while (rhsFront) {
        prev->next = new Node(rhsFront->data, nullptr);
        rhsFront = rhsFront->next;
        prev = prev->next;
    }
}

为什么从next开始而不是header。Node* prev = header;标头定义在哪里?您是否已经分配了所需的内存?相反,从头部开始复制。

List( const List & rhs ) {
    Node* rhsFront = rhs.header;
    Node* prev = header;
    while (rhsFront) {
        prev = new Node(rhsFront->data, rhsFront->next);
        rhsFront = rhsFront->next;
        prev = prev->next;
    }
}

这样你就复制了所有的节点,而不是跳过标题。希望这能说得通。此外,您得到的实际异常可能会提供关于哪个访问是NPE的线索。