Предположим, 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-> prev указывает на node2
, хотя node1->prev
является правильным.
tmp=node1->prev; // correct
node1->prev=node2->prev; // == node2
node2->prev=tmp; // correct
То есть node1->prev
указывает на node2
, что правильно.
Но node1->next
и node2->next
все еще не правы!
Как это решить? Это не однострочник, потому что есть пара особых случаев.
Возможно, обнаружите особый случай, который я описал, и получите для него отдельный код (и не забывайте об этом другом особом случае).
Написание этого кода оставлено читателю в качестве упражнения;)