【发布时间】:2020-08-18 07:35:37
【问题描述】:
我调用了一个函数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 看起来像 "1, 2, 3" 而 B 看起来像 "4, 5, 6" 的方式将单链表 A 和单链表 B 交织在一起,那么调用linkedListA.interleave(linkedListB) 应该使 A "1, 4, 2, 5, 3, 6"。我已经成功地创建了一个这样的列表,问题是它是 temp 列表,但我不知道如何制作它,所以它将是带有最终目标 linkedListA 的 this 指针是前面提到的“单链表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;
}
【问题讨论】:
-
列表B呢?函数执行后是否为空?
-
列表 B 中还有项目也没关系。
-
为什么参数不是常量引用?
-
这可能只是我们的讲师给我们的起始函数声明错误,作业明确指出您不必从
other中删除项目 -
“这是临时列表,但我不知道如何制作它,所以它会是 this 指针”——这用词很奇怪。我认为您的意思是“这是临时列表,但我不知道如何制作它,所以它将是
*this”,因为this指向的对象是当前对象。 (这与delete this;在您的赋值运算符中绝对错误的原因有关。如果您要删除应该接收赋值的对象,您将不再有对象来接收赋值。)
标签: c++ linked-list interleave