释放如图所示的链表,每个节点最多拥有两个子节点; 其实这是一个有环的树
递归释放(类DFS算法)
首先说一下…递归释放是一个正确的想法,但是这个过程中需要判断需要被释放的节点是否已经被释放过了?
在C语言中,如果出现了上述的有环链表,势必是通过指针链接的,以上面的例子为例:如果采用递归释放的话,一旦首先释放了节点4,此时节点4占用的内存确实不复存在了,但是,节点3的指针仍旧指向原先节点4的位置,纵使节点4已经被释放了;
此时如果采用,指针是否等于NULL来判断,将会产生严重的错误 此时指针一定不是NULL,但是由于节点4已经被释放,此时节点3的指针指向的内存中到底存放了什么东西就是一个不可知的事情了;
使用数据结构记录存在的
如果是有HashMap的语言,可以通过一个HashMap来记录删除情况,删除一个节点就向HashMap中添加一条记录,如此一来在进行释放之前,只需检查一下HashMap中是否存在释放记录,就能知道该节点是否被释放过;就C语言而言…当然你可以选择手写一个HashMap或者选择数组/链表一类的较为简单的数据结构完成这个工作,
