【问题标题】:Problems in Copying Skip List复制跳过列表中的问题
【发布时间】:2016-05-18 06:54:50
【问题描述】:

我在尝试为我的跳过列表编写复制功能时遇到了问题。由于大部分课程已经完成,我不想改变我的设计。

每个节点有两个指针,一个指向同一层的下一个节点,另一个指向下一层的等效节点。 在我的班级中,有一个向量存储指向每个级别的头节点的指针。

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-&gt;below 似乎不对,任何人都可以得到一些建议如何制作这份工作?

【问题讨论】:

  • 了解如何使用调试器,然后您可以在监视变量以及它们如何更改值的同时逐行执行代码。这应该可以帮助您调试自己的代码,看看它做了什么,在哪里以及为什么会出错。
  • @Joachim Pileborg 好吧,你的速度很快,但你的普遍评论没有任何意义..
  • Node 的构造函数是什么样的?此外,“将不起作用”不是一个非常有用的问题描述。

标签: c++ copy-constructor skip-lists


【解决方案1】:

您可以自下而上地进行,而不是从顶层向下进行。这样,无论何时你要创建一个节点的副本,你都已经有了它对应的“下面”的副本:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2012-09-25
    • 2014-07-02
    相关资源
    最近更新 更多