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;
提前感谢!
答案 0 :(得分:1)
了解正在发生的事情的关键是看每种情况下分配的内容:
*head = (*head)->next;
分配给head
指向的任何内容,它是原始头指针,传递给函数的指针,或某个先前节点的next
。我们修改指向的内容,而指针保持不变。这相当于从列表中删除(并在此过程中创建内存泄漏)。head = &(*head)->next
分配给head
本身,即它修改指针,而不是它指向的东西。这相当于在列表中向前跳过,而不进行修改。 注意: head
不是变量的理想名称。由于变量仅指向head
指针,直到第一个“跳过”,因此更好的名称为current
。