[英]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.