您能帮我调试此代码来交换双链接列表的两个节点吗?我无法弄清楚我在做什么错了:(

这是代码:

dll* swap_node(dll *head , dll *node1 , dll *node2) {
   dll *tmp;
   int flag=0;

   if(node1->prev!=NULL) {
       node1->prev->next=node2;
   } else {
       flag=1;
   }
   if(node1->next!=NULL) {
       node1->next->prev=node2;
   }

   if(node2->prev!=NULL) {
       node2->prev->next=node1;
   }
   if(node2->next!=NULL) {
       node2->next->prev=node1;
   }

   tmp=node1->next;
   node1->next=node2->next;
   node2->next=tmp;

   tmp=node1->prev;
   node1->prev=node2->prev;
   node2->prev=tmp;

   if(flag==1) {
       head=node2;
   }
   return head;
}


提前致谢

最佳答案

假设node1->next == node2 && node2->prev == node1。现在让我们跟踪:

if(node1->next!=NULL)
{
   node1->next->prev=node2;
}


现在node2->prev指向node2本身!

if(node2->prev!=NULL)
{
    node2->prev->next=node1;
}


现在node2->next指向node1,现在可以。

回想一下,node1->next仍指向node2,而node2->next指向node1

tmp=node1->next;  // == node2
node1->next=node2->next; // == node1 (!)
node2->next=tmp;  // == node2


因此,我们有node1->next指向node1node2->next指向node2。显然是错误的。

回想一下,尽管node2是正确的,但是node2-> prev指向node1->prev

tmp=node1->prev; // correct
node1->prev=node2->prev; // == node2
node2->prev=tmp; // correct


因此node1->prev指向node2,这是正确的。

但是node1->nextnode2->next仍然是错误的!



如何解决呢?这不是一味解决,因为有一些特殊情况。

也许可以检测到我描述的特殊情况,并为此编写单独的代码(不要忘记其他特殊情况)。

编写该代码留给读者练习;)

关于c - 调试帮助-交换2个双链接列表节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8306267/

10-11 16:46