C ++深层复制链接列表

时间:2016-11-25 05:38:42

标签: c++ struct linked-list

首先,这是我目前试图解决的任务的一部分。我正在尝试创建一个深度复制给定LinkedList的复制构造函数。 我已经编写了LinkedList方法。

这是LinkedList.h文件的必要部分。

LinkedList.h
private:
    struct node {
        Val data;
        node* next = nullptr;

    };

    typedef struct node* nodePtr;


    nodePtr head = nullptr;
    nodePtr current = nullptr;
    nodePtr temp = nullptr;
};

给出参数:" LinkedList :: LinkedList(const LinkedList& ll)" ll是要复制的链表。 我首先测试了链表中是否有头,如果没有则表示链表是空的。 然后我将头部从旧列表复制到新列表。 然后我将新电流设置到头部以准备while循环。 在while循环中,我正在复制当前节点的数据以及指向下一个节点的指针。 最后,我将下一个指针设置为nullptr,以表示新列表的结束。

LinkedList.cpp

LinkedList::LinkedList(const LinkedList & ll){
    if (ll.head == nullptr) {
        return;
    }
    head = ll.head;
    current = head;


    while (ll.current->next != nullptr) {
        current->data = ll.current->data;
        current->next = ll.current->next;
    }
    current->next = nullptr;
}

我不确定这是否是深度复制。 我也知道,当前的首发位置并不是最重要的。 我试过ll.current = ll.head。但是,因为给出了这个函数是const的。我无法设置它。

还有另一个功能:     LinkedList& LinkedList :: operator =(const LinkedList& ll)     {     } 我怀疑可能需要。我希望我可以使用它。

2 个答案:

答案 0 :(得分:2)

您需要在添加新内存或新列表元素时分配它们,更改代码以执行以下操作:

<div class="item active">
  <img class="first-slide" src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" alt="First slide">
  <div class="container">
    <div class="carousel-caption">
      <h1>Example headline.</h1>
      <p>Note: If you're viewing this page via a <code>file://</code> URL, the "next" and "previous" Glyphicon buttons on the left and right might not load/display properly due to web browser security rules.</p>
      <p><a class="btn btn-lg btn-primary" href="#" role="button">Sign up today</a></p>
    </div>
  </div>
</div> 

此外,在你的课堂上摆脱// LinkedList.cpp LinkedList::LinkedList(const LinkedList & ll) { if (ll.head == nullptr) return; // Create a temp variable since ll.current doesn't move/change. node* tmp = ll.head; // Allocate a new node in memory. head = new node; // Copy over the value. head->value = tmp->value; // Set the 'next' value to null (the loop will fill this in). head->next = nullptr; // Point 'current' to 'head'. current = head; // Move to next item in ll's list. tmp = tmp->next; while (tmp != nullptr) { // Allocate new memory for a new 'node'. current->next = new node; // Point to this new 'node'. current = current->next; // Copy over the data. current->data = tmp->data; // By default set the 'next' to null. current->next = nullptr; // Move along ll's list. tmp = tmp->next; } } 。没有必要,只需对typedef node* nodePtrnode*head使用current即可。最后,不要忘记在你的类'析构函数中清除动态分配的内存:

temp

答案 1 :(得分:1)

这不起作用,因为您从不为实际列表对象分配新的列表元素(使用&#39; new&#39;运算符),而只重用现有的列表元素。如果ll的元素多于实际列表,请考虑一下会发生什么?