下面是用于在不更改数据的情况下交换节点的代码。我想知道是否需要交换节点的下一个指针?交换当前节点不会交换下一个指针吗?为什么?
void swapNodes(Node** head_ref, int x, int y)
{
// Nothing to do if x and y are same
if (x == y)
return;
Node **a = NULL, **b = NULL;
// search for x and y in the linked list
// and store therir pointer in a and b
while (*head_ref) {
if ((*head_ref)->data == x) {
a = head_ref;
}
else if ((*head_ref)->data == y) {
b = head_ref;
}
head_ref = &((*head_ref)->next);
}
// if we have found both a and b
// in the linked list swap current
// pointer and next pointer of these
if (a && b) {
swap(*a, *b);
swap(((*a)->next), ((*b)->next));
}
}
void swap(Node*& a, Node*& b)
{
Node* temp = a;
a = b;
b = temp;
}
谢谢。
答案 0 :(得分:4)
是否需要交换节点的下一个指针?
是的,因为原始节点位于列表的不同位置,所以是必需的。
交换当前节点不会交换下一个指针吗?
是的,交换当前节点不会交换下一个指针。交换当前节点意味着仅交换仅指向当前节点的指针。
例如考虑列表
| A |next B| -> | B |next C| -> | C |next D| -> | D |next nullptr|
,让我们假设您需要交换节点B和D。然后您将得到
---------------------
| |
| A |next D| ... | B |next C| -> | C |next B| ... | D |next nullptr|
| |
----------------------------------------------
因此,在第一次交换之后,节点A指向节点D,但是节点D“指向” nullptr。如果不接下来交换其数据成员,则节点B和C将丢失。
因此,您还需要接下来交换其数据成员
--------------------------
| |
| A |next D| ... | B |next nullptr| | C |next B| ... | D |next C|
| |
---------------------------------------------------
结果,您将得到
| A |next D| -> | D |next C| -> | C |next B| -> | B |next nullptr|
答案 1 :(得分:2)
交换当前节点是不够的。
交换a和b时,它们的地址会更改,因此它们在列表中的位置将被替换
但是您不更改每个节点的内部字段。
节点说明:
a-b-c-d
让我们取节点a和c。
a->下一个==&b(正确)
c->下一个==&d(正确)
如果我们像这样交换节点:
c -b- a -d
节点 c 和节点 a 的地址将更改,但是列表看起来相同,因为它们的->下一个值不会更改
如果我们也交换-> next值,则该列表将被真正交换