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