当前位置: 首页 > 知识库问答 >
问题:

通过交换节点对双链表进行排序

谭志用
2023-03-14

我在实现哈夫曼算法,为此我使用了一个双链表。实现需要对列表进行排序,但仅仅交换数据是不够的——我需要交换整个节点。然而,这比我预想的要复杂一些。

我使用了这个选择排序的变体,但它会导致访问冲突错误。我假设这是因为我试图访问某个空指针,这两个条件本应阻止它。

任何帮助或建议都将不胜感激。

void sortiraj()
{
    Node *curr = top, *nxt;
    for (int i = 0; i < num - 1; ++i)
    {
        nxt = curr->next;
        for (int j = i + 1; j < num; ++j)
        {
            if (curr->prob > nxt->prob)
            {
                //swap prev
                if (curr != top)
                {
                    Node *temp_prev = curr->prev;
                    curr->prev = nxt->prev;
                    nxt->prev = temp_prev;
                }

                //swap next
                if (nxt != last)
                {
                    Node *temp_next = curr->next;
                    curr->next = nxt->next;
                    nxt->next = temp_next;
                }
            }
            nxt = nxt->next;
        }
        curr = curr->next;
    }
}

共有1个答案

彭浩穰
2023-03-14

如果当前节点是顶部节点,则仍然需要交换之前的指针。这是因为您需要指出,新顶部的“上一个指针”设置为NULL,而旧顶部的“上一个指针”设置为新顶部。

“下一个指针”也是如此。

交换上一个和下一个标志不需要条件。相反,您需要条件来指示顶部和最后一个节点已更改。

此外,在交换指针时,不能只交换前面的指针。这是因为,这将意味着其中一个将指向自己。正确的方法是这样做

nxt->prev = curr->prev;
curr->prev = nxt;

交换下一个指针时,同样的情况也适用。

 类似资料:
  • 我在Java中实现一个双链接列表时遇到了一个问题。特别是要交换2个以下节点(在我的例子中,一个节点包含一个政治候选人)。 假设下面的DLL: head- 作为输出,我没有从头到尾的正确DLL,但从头到尾都很好: 我已经写了几个版本的这个方法reverseTwoNode。我甚至尝试在节点内部交换数据,而不是交换节点,我也有同样的问题。你能帮我真是太好了,我花了这么多时间在这个简单的功能上,我看不出有

  • 024. Swap Nodes in Pairs[E] 题目 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should us

  • 我遇到了一个问题,在这个问题中,您应该交换双链接列表中的一组节点。例如:对于列表

  • 我正在尝试交换双链接列表中的两个节点。下面是具有交换功能的程序部分。 当我运行这个程序时,在第一个和第二个节点的情况下,它崩溃了。而在任何其他节点的情况下,它提供无限循环输出。(例如:-2- 我知道还有一些关于节点交换的问题,但是我没有找到任何与我的问题相似的问题。请帮帮我...!! 提前谢谢。

  • 我试图交换链表中节点的位置,然后使用排序函数进行排序。这两个函数中的任何一个都有逻辑错误。当我运行这个程序时,它会无限循环。 更新代码