C ++交换链表

时间:2018-01-13 09:09:50

标签: c++ linked-list

我在单链表中交换相邻节点时遇到了一些麻烦。这是我的交换功能:

void swap(std::shared_ptr<ListItem> root, int indexA, int indexB)
{
    if (indexA == 0)
    {
        std::shared_ptr<ListItem> A = root;
        std::shared_ptr<ListItem> B = A->next;

        A->next = B->next;
        B->next = A;
        root = B;
    }
    else if (indexB == 0)
    {
        std::shared_ptr<ListItem> B = root;
        std::shared_ptr<ListItem> A = B->next;

        B->next = A->next;
        A->next = B;
        root = A;
    }
    else
    {
        std::shared_ptr<ListItem> preA = GetNode(root, indexA - 1);
        std::shared_ptr<ListItem> preB = GetNode(root, indexB - 1);
        std::shared_ptr<ListItem> A = preA->next;
        std::shared_ptr<ListItem> B = preB->next;
        std::shared_ptr<ListItem> temp = B->next;

        preA->next = B;
        A->next = temp;
        B->next = A;
    }
}

现在您可以看到此代码仅处理相邻节点。那是因为我只在我的排序功能中使用它:

void LinkedList::sort() {
    for (int i = 0; i <= this->getSize(); i++)
    {
        int j = i;
        while (j > 0 && getItem(j) < getItem(j - 1))
        {
            swap(root, (j - 1), j);
            j = j - 1;
        }
    }
}

因此,每次运行交换功能时,发送的节点都将相邻。我的问题是我现在正在交换的方式我在途中丢失了节点,它们之间的链接在某处被破坏但我真的不明白为什么或在哪里。我的猜测是我需要使用一个临时节点,但由于我不知道链接被破坏的原因或位置,我也不知道我需要在哪里使用临时节点。 / p>

此刻,preB节点从未被使用过,这是一个修复失败尝试的遗留物。任何提示将不胜感激!

1 个答案:

答案 0 :(得分:0)

事实证明我的问题是我以前从未考虑过的问题。它是sort函数中的这一行:

UPDATE players_extra e
INNER JOIN
(
    SELECT PlayerId, COUNT(*) AS cnt
    FROM records
    WHERE Date BETWEEN '2018-01-01 20:21:28' AND '2018-01-11 21:00:43'
    GROUP BY PlayerId
) r
    ON e.playerId = r.PlayerId
SET e.hetimostfin = r.cnt;

这总是让它走得太远了,我为getItem()添加了一种故障保护,这使得很难确定。基本上在getItem()中我说如果我正在寻找的节点是nullptr,则返回0.这真的很愚蠢,因为它看起来好像问题出在swap()而不是sort()。

所以我将这一行更改为:

for (int i = 0; i <= this->getSize(); i++)

它现在有效。真是愚蠢的错误,我为浪费人们的时间而道歉。还非常感谢@ manni66帮助我解决这个问题!