研究链表空间销毁问题

简介: 所以我们在销毁cur以后,就不能再通过cur去找下一个结点了,那这样我们就无法再找到下一个结点了。

💯💯💯


1.研究链表空间销毁问题


当链表使用完后,需要将链表销毁,那么该如何销毁呢?


void SLTDestroy(SLTNode* phead)//销毁单链表
{
  SLTNode* cur = phead;
   while(cur)
   {
  free(cur);
  cur = cur->next;
  }
}


你看这样对吗?


将cur指向的结点销毁,然后再去找下一个结点,依次循环直到没有结点为止。


但问题是cur都已经销毁了,下面怎么还能使用cur呢?


我们所说的销毁只是将空间的使用权归还给操作系统,使那块区域不再受原本指针控制,那块空间仍然存在,但里面的数据不一定存在。


所以我们在销毁cur以后,就不能再通过cur去找下一个结点了,那这样我们就无法再找到下一个结点了。


817c699c53e44081a0c04a28d2ce85b0.png


然后有人想那我们保存一下cur不就好了吗?


void SLTDestroy(SLTNode* phead)//销毁单链表
{
  SLTNode* cur = phead;
  //用一个指针exist来保存cur
    //然后释放cur再根据exist来找到下一个结点的
  SLTNode* exist = cur;
  while (cur)
{
  free(cur);
  cur = exist->next;
}
}


看似很合理但其实不合理


cur是用来保存phead,而exist是用来保存cur


想通过exist的来找到cur的下一个结点


这个问题和上面是一样的


也就是cur和exist先在都指向同一个结点,然后我们释放这个结点后,cur和


exist都没有用了呀,都不再指向原来的空间,我们保存的不是指向该结点的指针,而是应该保存这个结点啊,这样才能找到这个结点,不然一旦销毁,就找不回来了,还有我们是要找到cur下一个结点的地址哎,我们可以保存指向下一个结点的地址,这样就可以找到第二个结点了


我们应该是保存下一个结点的地址,不要保存自己的地址


void SLTDestroy(SLTNode* phead)//销毁单链表
{
  SLTNode* cur = phead;
//所以我们定义一个next指向cur的下一个结点的地址
  SLTNode* next = cur->next;
  while (cur)
  {
    free(cur);
    cur = next;
  }
}


这样就可以不断的释放结点了。


不过我们是不是忘记什么了?


释放后要将指针置NULL,那我们是不是就直接将cur置为NULL呢?


我们要注意到这里的参数是一级指针,要想真实改变它,需要的是二级指针才行,也就是在这里将cur置为NULL,而在函数外部,cur仍然不是NULL,因为cur是形参,形参的改变不影响实参,不过我们可以在函数外面将实参置NULL,每次调用销毁函数时,都不要忘记手动置空就可以了。


3ccd5b1a4da64b1e901ee382dd6696ba.png


还有一种方法,我们可以通过指针来改变,有的人可能认为cur这不就是指针吗,我们要改变cur这个指针,需要改动的它的指针,也就是二级指针,


将二级指针传过来,然后我们对它解引用访问的就是指向cur的空间了,这时在函数内部将cur置NULL就可以啦。


b97f7deec82c49de85ee570cd9812940.png


2.总结: 要改变谁就要传它的指针过去


要改变int 类型的变量,就要传int*过去。


要改变指针,就要传它的指针。


理论就是形参的改变不影响实参

相关文章
【数据结构】研究链表深度拷贝问题
深度拷贝指的是将该链表上每个结点都拷贝过来,链接形式是与原链表一模一样。但要注意的是,拷贝的链表的链接形式虽然跟原链表一样,但它们的地址都是不同的,拷贝的链表中的指针都不应该指向原链表中的结点。
92 0
【数据结构】研究链表带环问题
我们只要判断它们是否相遇了,就能确定是否带环,因为如果没有带环的话,那就不可能相遇,快指针肯定先走出去。
123 0
|
存储 算法
算法基础~链表【将链表逆序题(不可申请额外的空间)~头插法】
算法基础~链表【将链表逆序题(不可申请额外的空间)~头插法】
123 0
算法基础~链表【将链表逆序题(不可申请额外的空间)~头插法】
|
6月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
5月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
56 2
|
6月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
53 1
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表