c - C [链接列表]中 (*head)->next 和 &(*head)->next 之间的区别

标签 c pointers linked-list

typedef struct n {
    int data;
    struct n *next;
}node;

此函数删除所有具有奇数值的节点(不释放内存或其他变量):

void deleteOdds (node **head) {

    if (*head == NULL) {
        return;
    }
    while ((*head)->next) {

        if ((*head)->data % 2 != 0) {
            *head = (*head)->next;
        } else head = &(*head)->next;
    }

}

我理解逻辑(并且已经有了一些假设),但我不确定如何解释两者之间的区别

*head =(*head)->next;

head = &(*head)->next;

提前致谢!

最佳答案

了解正在发生的事情的关键是查看每种情况下分配的内容:

  • *head = (*head)->next; 分配给 head 指向的任何内容,它是原始头指针,传递给的指针到函数,或某个先前节点的 next。我们修改指向的内容,而指针保持不变。这相当于从列表中删除(并在此过程中造成内存泄漏)。
  • head = &(*head)->next 分配给 head 本身,即它修改指针,而不是它指向的东西。这相当于在列表中跳过,而不修改它。

注意: head 不是变量的理想名称。由于变量仅指向 head 指针直到第一个“skip”,因此更好的名称是 current

关于c - C [链接列表]中 (*head)->next 和 &(*head)->next 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39315893/

相关文章:

c - c语言数组的定义

c++ - Photoshop如何将两张图片融合在一起?

java - 判断链表是否是回文

c++ - 检查链接列表中的重复项

c - 如何退出 C 中长时间运行的函数?

c - 我应该在我的应用程序关闭时关闭套接字吗?

c++ - i2c 中的字节指针数组

由于破坏 C 中的 "object"而更改指针

opencv:执行在图像像素访问的双指针算法处停止

c - 打印链表时出错