我在尝试为我的跳过列表编写复制功能时遇到了问题。由于大部分课程已经完成,我不想改变我的设计。
每个节点有两个指针,一个指向同一级别的下一个节点,另一个节点指向下一级的等效节点。 在我的班级中,有一个向量存储指向每个级别的头节点的指针。
struct Node
{
int key;
Node* next;
Node* below;
}
vector<Node*> levels;
我的私人复制功能:
void copyAll(const SkipList& s)
{
for(unsigned int i = 0; i < s.level.size(); ++i)
{
Node* curr = s.level[i];
Node* copy = new Node(curr->key, nullptr, curr->below);
level.push_back(copy);
curr = curr->next;
while(curr != nullptr)
{
copy->next = new Node(curr->key, nullptr, curr->below);
copy = copy->next;
curr = curr->next;
}
}
}
该功能水平工作,每个节点复制并相互链接,但它不会垂直设置任何链接。
curr->below
似乎没有问题,任何人都可以获得一些如何使其发挥作用的建议?
答案 0 :(得分:0)
你可以自下而上地从顶层开始。这样,无论何时您要创建Node的副本,您都已经拥有了相应的&#34;下面的#34;
的副本void copyAll(const SkipList& s)
{
level.resize(s.level.size());
for(unsigned int i = s.level.size(); i > 0; --i)
{
Node* curr = s.level[i-1]; // Note the intended change in the range of i
Node* curBelowCopy = // If not the bottom, ptr to start of the row below
curr->below ? level[i] : nullptr;
Node* copy = new Node(curr->key, nullptr, curBelowCopy);
level[i-1] = copy;
curr = curr->next;
while(curr != nullptr)
{
if (curBelowCopy) {
// Not the last level: advance curBelowCopy to the
// corresponding copy of cur->below
while (curBelowCopy->key != curr->below->key)
curBelowCopy = curBelowCopy->next;
}
copy->next = new Node(curr->key, nullptr, curBelowCopy);
copy = copy->next;
curr = curr->next;
}
}
}