【问题标题】:Swap two adjacent nodes in a doubly linked list交换双向链表中的两个相邻节点
【发布时间】:2021-03-09 03:33:27
【问题描述】:

我正在学习 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;
}

【问题讨论】:

    标签: pointers linked-list doubly-linked-list


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这回答了您的问题吗?能否给点意见?
    • 非常感谢!这很好解释。很抱歉迟到了。直到那时我才能访问我的计算机。
    • 很高兴听到。不要忘记mark the answer as accepted
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多