我正在解决一些指针/链表问题。其中一个问题是删除列表中的所有节点并将头指向空。
我的解决方案与给定的答案不同。我是新来的,所以我很难弄清楚我的是不是和为什么不工作。我遇到的主要问题是试图理解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
指针。 最佳答案
你发的代码没问题。删除所有节点的关键步骤是确保不尝试删除指针,然后跟随其next
指针。因为您使用compliment
指针来保存每次迭代的下一个节点,所以您所拥有的看起来很好。
至于free(*headRef)
-这将释放headRef
指向的指针。完成此操作后,应确保不再跟随指针*headRef
。由于您立即将下一行中的*headRef
更改为指向链接列表中的下一个节点,因此无需担心。主要的问题是不要free
指针,然后尝试取消对它的引用。free
使用指针并不会以某种方式“毒害”指针变量并使其变差;相反,它会使指针对象失去作用并使其变差。
一个细节-函数的最后一行是不必要的,因为当您访问链表的最后一个节点并遍历它的next
指针时,您将得到NULL
。这意味着循环的最终迭代将为您设置*headRef
以指向NULL
。
希望这有帮助!