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

时间:2021-03-09 03:33:27

标签: pointers linked-list 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;
}

1 个答案:

答案 0 :(得分:0)

第一个版本不复制 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;
}
相关问题