我正在处理一些指针/链接列表问题 . 其中一个问题是删除列表中的所有节点并将头指向NULL .
我的解决方案与给定的答案不同 . 我无法弄清楚我是否以及为什么没有试图了解 free(*headRef);
的结果是什么,以及 *headRef
之后是否可以共享一个不同的指针 .
我的想法是:因为我有 compliment
指向下一个节点,我可以释放指向第一个节点的 *headRef
(或者更一般地,指向一个恭维指向的节点) . 然后,我可以将 *headRef
指向 compliment
并且该过程可以继续 .
这是我的代码:
void DeleteList(struct node** headRef){
struct node* compliment = *headRef;
while (compliment != NULL){
compliment = compliment->next;
free(*headRef);
*headRef = compliment;
}
*headRef = NULL;
}
假设每个节点都带有两个属性:int和 ->next
指针 .
2 回答
您_462982尝试删除指针然后跟随其
next
指针的代码 . 由于您使用compliment
指针在每次迭代时保存下一个节点,因此您看起来很好 .至于
free(*headRef)
- 这将释放headRef
指向的指针 . 一旦你完成了这个,你应该确保不再按照指针*headRef
. 由于您在下一行中立即更改*headRef
以指向链接列表中的下一个节点,因此您无需担心 . 主要关注的不是free
指针,然后尝试解除引用它 .free
ing指针不会以某种方式"poison"指针变量并使其变坏;相反,它会使指针失败并使其变坏 .一个细节 - 函数的最后一行是没有必要的,因为当你访问链表的最后一个节点并遍历它的
next
指针时,你将获得NULL
. 这意味着循环的最后一次迭代将*headRef
设置为指向NULL
.希望这可以帮助!
你可以用更少的代码做:
说明:
循环内部
*headref = tmp->next;
有效循环后