调试帮助-交换2个节点的双链表



你能帮我调试一下这段代码交换双链表的两个节点吗?我不知道我做错了什么:(

下面是代码:
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;
}

Thanks in advance

node1->next == node2 && node2->prev == node1现在我们输入trace:

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指向node1, node2->next指向node2。显然错误的。

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

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

所以node1->prev指向node2,这是正确的。

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


如何解决这个问题?这不是一行代码可以解决的,因为有一些特殊情况。

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

写代码留给读者作为练习;)

你的逻辑行不通,

  1. 如果node2是双链表中的第一个元素
  2. node1node2相邻

请注意下面给出的更新后的逻辑。

<>之前Dll * swap_node(Dll *head, Dll *node1, Dll *node2){dll* previous_to_node1 = NULL;dll* next_to_node1 = NULL;* previous_to_node2 = NULL;dll* next_to_node2 = NULL;if ((node1 == NULL) || (node2 == NULL))返回0;Previous_to_node1 = node1->previous;Next_to_node1 = node1->next;Previous_to_node2 = node2->previous;Next_to_node2 = node2->next;if (previous_to_node1 != NULL) previous_to_node1->next = node2;if (next_to_node1 != NULL) next_to_node1->previous = node2;if (pevious_to_node2 != NULL) previous_to_node2->next = node1;if (next_to_node2 != NULL) next_to_node2->previous = node1;node1 -> = next_to_node2;node1 ->之前= previous_to_node2;node2 -> = next_to_node1;node2 ->之前= previous_to_node1;if (previous_to_node1 == NULL){返回node2;}if(previous_to_node2 == NULL){返回node1;}返回头;}

相关内容

  • 没有找到相关文章

最新更新