交换双向链表中的两个相邻节点
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
属性(以及next
和prev
属性)。现在,当 a->value
发生变化时,temp
与该变化无关,因此 temp.value
仍然是分配给 a->value
之前的状态。这正是您成功交换所需要的。
甚至可以 只 复制 value
属性 值,而不是节点(它还有其他属性,如 prev
和 next
), 因为你真的只需要一份 value
;没有别的(我在这里假设 value
是一个 int
):
void swapNode(DLListNode *a, DLListNode *b)
{
int value = a->value;
a->value = b->value;
b->value = value;
}
我正在学习 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
属性(以及next
和prev
属性)。现在,当 a->value
发生变化时,temp
与该变化无关,因此 temp.value
仍然是分配给 a->value
之前的状态。这正是您成功交换所需要的。
甚至可以 只 复制 value
属性 值,而不是节点(它还有其他属性,如 prev
和 next
), 因为你真的只需要一份 value
;没有别的(我在这里假设 value
是一个 int
):
void swapNode(DLListNode *a, DLListNode *b)
{
int value = a->value;
a->value = b->value;
b->value = value;
}