Поскольку interleave
определяется как функция-член AddressLinkedList
, она должна модифицировать (и работать над) объект, к которому она была вызвана. Таким образом, вам не нужно (и не нужно) создавать временный список, чтобы использовать его для построения вашей результирующей коллекции, а затем «назначить» его как this
. Это возможно с некоторыми хитростями new
, delete
и raw 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
и создавался новый узел.