交换双向链表

Swap Doubly Linked List

本文关键字:双向链表 交换      更新时间:2023-10-16

好的。

所以我一直在尝试实现一个带有交换函数的双向链表。

我在网上找到了很多解释如何做到这一点的网站 - 在几乎所有网站(包括一些来自Stack Overflow的网站)中,关于实现是否正确的评论中开始争论。我已经尝试了其中的几个,但无济于事。换句话说,我找不到这个算法的单一最终版本。

我已经尝试了至少 4-5 种与我在网上找到的算法不同的算法,以及一些我试图自己整理的算法,但我不断遇到元素排序不正确的问题。我完全处于我的智慧尽头。

这是我尝试过的最新版本,它不起作用:

template <typename T>
void PriorityQueue<T>::swap(Node * n1, Node * n2){
    if(n1 == n2)
        return;
    if(n1 == 0 || n2 == 0){
        std::cout << "nPRIORITYQUEUE ERROR: Trying to swap with non-existent noden";
        return;
    }
    Node * temp = new Node;
    temp->prev = n1->prev;
    temp->next = n1->next;
    n1->prev = n2->prev;
    n1->next = n2->next;
    n2->prev = temp->prev;
    n2->next = temp->next;
    if(n1->next != 0)
        n1->next->prev = n2;
    if(n1->prev != 0)
        n1->prev->next = n2;
    if(n2->next != 0)
        n2->next->prev = n1;
    if(n2->prev != 0)
        n2->prev->next = n1;
    delete temp;
}

我非常沮丧。请有人,请,请通过向我展示一个完整的工作算法来帮助我。没有链接到具有损坏算法的页面并评论如何修复它(我已经尝试了几次),而只是算法。它甚至不需要是代码,只需要一个算法。请。我厌倦了试图解决这个问题,所以这个项目落后于计划,如果有人绝对可以帮助我一劳永逸地解决这个问题,我将永远感激不尽。

您在最后一行的问题。我纠正了它们:

if(n1->next != 0)
    n1->next->prev = n1; // n2;
if(n1->prev != 0)
    n1->prev->next = n1; // n2;
if(n2->next != 0)
    n2->next->prev = n2; // n1;
if(n2->prev != 0)
    n2->prev->next = n2; // n1;

在函数的开头,您有两个节点n1n2,并带有指向其他元素n1pn1nn2pn2n 的指针。

<-| p |  <-| p |  <-| p |
  |n1p|    | n1|    |n1n|
  | n |->  | n |->  | n |->
<-| p |  <-| p |  <-| p |
  |n2p|    | n2|    |n2n|
  | n |->  | n |->  | n |-> 

temp变量的第一部分中,您可以交换n1节点和n2节点的指针。所以你会遇到这样的情况。

<-| p |  <-| p |  <-| p |
  |n1p|    | n2|    |n1n|
  | n |->  | n |->  | n |->
<-| p |  <-| p |  <-| p |
  |n2p|    | n1|    |n2n|
  | n |->  | n |->  | n |->

你的问题是你错误地更改了n1pn1nn2pn2n的指针。看一下具有 sinplized 类 Node 和 corcted swap 函数的示例。