复制单链表的构造函数节点类

Posted

技术标签:

【中文标题】复制单链表的构造函数节点类【英文标题】:Copy Constructor Node class for a Singly Linked List 【发布时间】:2014-03-17 19:15:04 【问题描述】:

好的,所以我正在编写一个 Node 类,它是元素类型的容器。我应该编写一个复制构造函数来遍历节点类的链接并复制每个节点。

对于 Node 类,唯一的变量是一个 Element(包含的数据)和一个指向下一个节点的指针,如果没有下一个节点,它将指向 nullptr。

我知道我需要制作一个“深度”副本并为每个指向的节点创建新节点。

我所拥有的是这样的:

    Node::Node(const Node& rhs)
    
         ele(the element) = rhs.ele;
         next = rhs.next;
         Node cur = Node(ele);
         cur.next = next;
         while(cur.next != nullptr)
         
              Node* n = new Node(cur.ele);
              (*n).next = cur.next;
              cur = *(cur.next);
         
         return *this;
     

显然这根本行不通。据我了解,为了保留副本,我需要将新节点存储在堆上并继续分配新节点,直到我命中 nullptr,但我不确定如何准确实现这一点。谢谢!

【问题讨论】:

分离 NodeList 的类(你的单个元素和它们的容器)。 您应该使用 std::list 或 std::vector 容器类。如果您可能想查看 C++ STL 的源代码并了解它是如何实现的以及如何使用 std::allocator 进行内存管理。 【参考方案1】:

您将节点的概念与列表的概念混为一谈。类节点不必有复制构造函数。它是必须有一个复制构造函数的类列表。

如果你的列表只是一个指向头部节点的指针,那么你需要编写一个单独的函数来克隆一个现有的列表。

例如,函数可能如下所示

Node * Clone( const Node *head )

   Node *new_head = nullptr;

   if ( head )
   
      new_head = new Node  head->ele, nullptr ;

      for ( Node *p1 = head, *p2 = new_head; p1->next; p1 = p1->next, p2 = p2->next )
      
         p2->next = new Node  p1->next->ele, nullptr ;
      
   

   return new_head;

【讨论】:

以上是关于复制单链表的构造函数节点类的主要内容,如果未能解决你的问题,请参考以下文章

基于节点的链表的参数化构造函数

C++链表移动赋值和移动构造函数

为啥隐式复制构造函数调用基类复制构造函数而定义的复制构造函数不调用?

如何从派生类复制构造函数调用基类复制构造函数? [复制]

指针向量的复制构造函数

如何为单列和双列节点c ++构造模板层次结构