【问题标题】:Copying a SkipList / Linked List复制 SkipList / Linked List
【发布时间】:2022-11-28 17:03:35
【问题描述】:

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

  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;
  }
}

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

【问题讨论】:

  • 您的代码不会向 this->head->next[i] 添加任何内容,如果这是您想要的。
  • @Someprogrammerdude 对此表示歉意,[i] 用于跳过列表。我修改了我的代码以适用于链接列表,因此更容易理解。
  • 如果这是您的目的,您仍然没有将任何内容复制到 this 对象。您只需从第二个节点到最后一个节点遍历列表。 newCurr = curr 赋值实际上是无用的,什么也不做。
  • 如果你要克隆一个列表,那么你肯定需要为新列表分配一些新节点。您的代码不会那样做,所以它不可能是正确的。

标签: c++ linked-list skip-lists


【解决方案1】:

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

例如:

this->head = other.head;

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

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

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

这是对您的 sn-p 的更正:

  // 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 构造函数,它采用节点值的单个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多