复制功能链表c ++

时间:2014-12-10 15:48:35

标签: c++ list

我试图编写一个函数来将一个链表的内容复制到一个新的链表中(不引用第一个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;
            }
        }
}

然而,当我在一个小的链表上运行代码时,它只是复制第一个和最后一个节点 - 由于某种原因它错过了中间部分。我花了一段时间研究其他人的解决方案并试图找出我的错误,但是我碰到了一堵砖墙!

有人可能指出我出错的地方吗?

亲切的问候

克雷格

3 个答案:

答案 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循环中的两个迭代器 ,并将以锁步方式推进它们。