0

我调用一个interleave看起来像的函数

void AddressLinkedList::interleave(AddressLinkedList& other) {
    AddressLinkedList temp;
    AddressListNode* thisCur = this->head;
    AddressListNode* otherCur = other.head;
    for (int i = 0; i < this->length + other.length; i++) {
        if (i % 2 == 0) {
            temp.insertEnd(thisCur->data);
            thisCur = thisCur->next;
        }
        else if (i % 2 != 0) {
            temp.insertEnd(otherCur->data);
            otherCur = otherCur->next;
        }
    }
    return;
}

这个函数应该将单链表 A 与单链表 B 交织在一起,如果 A 看起来像“1、2、3”而 B 看起来像“4、5、6”,那么调用linkedListA.interleave(linkedListB)应该使 A “1、4、2、5、3、6”。我已经成功地创建了一个这样的列表,问题在于它是temp列表,但我不知道如何制作它,所以它this的最终目标linkedListA是前面提到的“单链表 A”的指针. 如果它很重要,下面是重载的赋值运算符和insertEnd函数。

void AddressLinkedList::insertEnd(const Address& value) {
    if (length == 0) {
        this->insertStart(value);
        return;
    }
    AddressListNode* temp = new AddressListNode(value);
    length++;
    tail->next = temp;
    tail = temp;
}
AddressLinkedList& AddressLinkedList::operator=(const AddressLinkedList& other) {
    delete this;
    AddressListNode* current;
    current = other.head;
    while (current != nullptr) {
        insertEnd(current->data);
        current = current->next;
    }
    return *this;
}
4

1 回答 1

0

由于interleave被定义为它的成员函数,AddressLinkedList它应该修改(并处理)它被调用的对象。因此,您不需要(也不应该)创建一个临时列表来使用它来构建您的结果集合,然后将其“分配”为this. 有一些new,deleteraw pointer诡计是可能的,但我不建议这样做(想法是创建AddressListNode*为头,然后将新头分配到原始头的位置,但您还必须删除以前的 AddressListNode* 链原头避免内存泄漏,正如我所说,不推荐)。

假设您调用此方法的代码如下所示:

AddressLinkedList A;
AddressLinkedList B;
... //inserting values to A and B
A.interleave(B);

您的interleave实现应该看起来更像这样(它更多的是概念证明,而不是工作解决方案,我没有编译它):

void AddressLinkedList::interleave(AddressLinkedList& other) {
    AddressListNode* thisCur = head;
    AddressListNode* otherCur = other.head;
    while (thisCur != nullptr) { //assumig that last node points to nullptr
        AddressListNode* nextNode = thisCur->next;
        AddressListNode* otherNext = otherCur->next;
        thisCur->next = otherCur; //attach it to node from other
        thisCur = thisCur->next; //advance to next node
        thisCur = nextNode; //reattach node that was originally after current
        thisCur = thisCur->next; //advance again to next node
        otherCur = otherNext ; //advance on other
    }
    other->head = nullptr; //loop above hijack nodes from other
}

所有这些代码所做的就是,它需要你的两个集合的负责人,迭代this并为它附加相应节点的每个节点从other. 实际上,它将修改您最初调用interleave方法的对象。但是,由于修改AddressListNode指针,它也会破坏您AddressLinkedList传递的原始文件和参数interleave。因此,您可能应该以thisCur->next = otherCur;实际创建副本Address并创建新节点的方式对其进行修改。

于 2020-05-03T23:39:47.793 回答