交换双向链表中的两个相邻节点

Swap two adjacent nodes in a doubly linked list

我正在学习 C 编程中指针的概念。我写了一个如下的函数来交换双向链表中的两个相邻节点;

void swapNode(DLListNode *a, DLListNode *b)
{
    DLListNode *temp = a;
    a->value = b->value;
    b->value = temp->value;
}

它不起作用,因为 b 的值成功传递给 a,但是 a 的值没有传递给 b。然后我发现如果我这样写代码,它可以工作。有人可以向我解释一下区别吗?非常感谢。

void swapNode(DLListNode *a, DLListNode *b)
{
    DLListNode temp = *a;
    a->value = b->value;
    b->value = temp.value;
}

第一个版本不复制 a 指向的值。它只是创建了对 a 已经引用的内容的第二个引用。当 a->value 获得一个新值时,当然这就是 temp->value 获得一个新值的同义词。

在第二个版本中,您创建了一个 节点 ,它从 a 引用的内容中获取其属性。所以在这里你复制value属性(以及nextprev属性)。现在,当 a->value 发生变化时,temp 与该变化无关,因此 temp.value 仍然是分配给 a->value 之前的状态。这正是您成功交换所需要的。

甚至可以 复制 value 属性 值,而不是节点(它还有​​其他属性,如 prevnext), 因为你真的只需要一份 value;没有别的(我在这里假设 value 是一个 int):

void swapNode(DLListNode *a, DLListNode *b)
{
    int value = a->value;
    a->value = b->value;
    b->value = value;
}