簡體   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