繁体   English   中英

复制 SkipList / Linked List

[英]Copying a SkipList / Linked List

在编程任务中,我需要克隆一个链表(它是一个复制构造函数,所以除了克隆之外不返回任何东西)。 旧链表将经历一些删除和添加元素,但新克隆的链表应保持不变。 我怎么做? 当我删除新节点并将其添加到旧列表时,它也会对新链表执行相同的操作。 我怎样才能避免这种情况?

  this->head = other.head;
  this->head->val = other.head->val;

  SNode *curr = other.head->next;
  SNode *newCurr = nullptr;
  while (curr != nullptr) {
    newCurr = curr;
    curr = curr->next;
  }
}

我试过上面的代码,但是当我修改旧列表时,即添加和删除节点时,它也会在新列表中添加和删除节点。 我该怎么做才能避免在新列表中发生修改?

您的代码没有创建新节点,因此这行不通。 克隆列表应包含新节点,因此应调用SNode构造函数。

例如:

this->head = other.head;

这只会使新列表指向同一个列表:现在你有两个head指针指向同一个头节点。 然后,结果,下面的赋值没有做任何有用的事情,因为它实际上是将成员自己的值赋给自己:

this->head->val = other.head->val;

该循环也没有做任何有用的事情,因为它没有将任何东西分配给属于新结构的任何成员。 它只分配给变量,遍历带有两个变量的原始列表,其中newCurr落后于curr一步。

这是您的代码段的更正:

  // Deal with boundary case: empty list
  this->head = NULL;
  if (other.head == NULL) return; // Nothing more to do.
  
  // Clone the head node
  this->head = new SNode(other.head->val);

  SNode *curr = other.head->next;
  SNode *tail = this->head; // tail is a more descriptive name
  while (curr != nullptr) {
    tail->next = new SNode(curr->val); // Clone current node and append it
    tail = tail->next; // This new node is now the tail
    curr = curr->next;
  }

这假定您有一个SNode构造函数,该构造函数采用节点值的单个参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM