我试图编写一个函数来将一个链表的内容复制到一个新的链表中(不引用第一个LL)。 我到目前为止得到了这个:
void List::copy(const List& otherList)
{
assert(head == nullptr);
if (otherList.head != nullptr)
{
head = new Node;
assert(head != nullptr);
head->item = otherList.head->item;
Node* ptr1 = head;
for (Node* ptr2 = otherList.head->next; ptr2 != nullptr; ptr2=ptr2->next)
{
ptr1->next = new Node;
assert(ptr1->next != nullptr);
(ptr1->next)->item = ptr2->item;
(ptr1->next)->next = ptr2-> next;
}
}
}
然而,当我在一个小的链表上运行代码时,它只是复制第一个和最后一个节点 - 由于某种原因它错过了中间部分。我花了一段时间研究其他人的解决方案并试图找出我的错误,但是我碰到了一堵砖墙!
有人可能指出我出错的地方吗?
亲切的问候
克雷格
答案 0 :(得分:2)
你没有向你推销新名单。
void List::copy(const List& otherList)
{
assert(head == nullptr);
if (otherList.head != nullptr)
{
head = new Node;
assert(head != nullptr);
head->item = otherList.head->item;
Node* ptr1 = head;
for (Node* ptr2 = otherList.head->next; ptr2 != nullptr; ptr2=ptr2->next)
{
ptr1->next = new Node;
assert(ptr1->next != nullptr);
(ptr1->next)->item = ptr2->item;
ptr1 = ptr1->next;
}
ptr1->next = 0;
}
}
答案 1 :(得分:1)
您的代码永远不会更新ptr1
的值。它保持等于head
,并且您不断更新新的head
->next
,将已分配的Nodes
泄漏到无效状态。
答案 2 :(得分:0)
改变这个:
Node* ptr1 = head;
for (Node* ptr2 = otherList.head->next; ptr2 != nullptr; ptr2=ptr2->next)
{
ptr1->next = new Node;
assert(ptr1->next != nullptr);
(ptr1->next)->item = ptr2->item;
(ptr1->next)->next = ptr2-> next;
}
对此:
for (Node* ptr2 = otherList.head->next, ptr1 = head; ptr2 != nullptr; ptr2 = ptr2->next, ptr1 = ptr1->next)
{
ptr1->next = new Node;
(ptr1->next)->item = ptr2->item;
(ptr1->next)->next = nullptr;
}
此更改将初始化for
循环中的两个迭代器 ,并将以锁步方式推进它们。