您能帮我调试此代码来交换双链接列表的两个节点吗?我无法弄清楚我在做什么错了:(
这是代码:
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
指向node1
,node2->next
指向node2
。显然是错误的。回想一下,尽管
node2
是正确的,但是node2-> prev指向node1->prev
。tmp=node1->prev; // correct
node1->prev=node2->prev; // == node2
node2->prev=tmp; // correct
因此
node1->prev
指向node2
,这是正确的。但是
node1->next
和node2->next
仍然是错误的!如何解决呢?这不是一味解决,因为有一些特殊情况。
也许可以检测到我描述的特殊情况,并为此编写单独的代码(不要忘记其他特殊情况)。
编写该代码留给读者练习;)
关于c - 调试帮助-交换2个双链接列表节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8306267/