首页 文章

链接列表和通过* headRef删除节点

提问于
浏览
4

我正在处理一些指针/链接列表问题 . 其中一个问题是删除列表中的所有节点并将头指向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 回答

  • 5

    您_462982尝试删除指针然后跟随其 next 指针的代码 . 由于您使用 compliment 指针在每次迭代时保存下一个节点,因此您看起来很好 .

    至于 free(*headRef) - 这将释放 headRef 指向的指针 . 一旦你完成了这个,你应该确保不再按照指针 *headRef . 由于您在下一行中立即更改 *headRef 以指向链接列表中的下一个节点,因此您无需担心 . 主要关注的不是 free 指针,然后尝试解除引用它 . free ing指针不会以某种方式"poison"指针变量并使其变坏;相反,它会使指针失败并使其变坏 .

    一个细节 - 函数的最后一行是没有必要的,因为当你访问链表的最后一个节点并遍历它的 next 指针时,你将获得 NULL . 这意味着循环的最后一次迭代将 *headRef 设置为指向 NULL .

    希望这可以帮助!

  • 1

    你可以用更少的代码做:

    void DeleteList(struct node **headRef){
    
        struct node *tmp;
    
        while ((tmp = *headref)){
                *headRef = tmp->next
                free(tmp);                
        }
    }
    

    说明:

    • 如果在* headref有删除内容,你只能进入循环
      循环内部
    • :tmp不能为NULL,因此取消引用tmp是安全的,所以 *headref = tmp->next; 有效
      循环后
    • ,保证* headref == NULL

相关问题