LinkedList析构函数样式

LinkedList Destructor Style

本文关键字:样式 析构函数 LinkedList      更新时间:2023-10-16

给出以下标题:

#ifndef LIST_H
#define LIST_H
#include "ListEle.h"
class List{
private: ListEle* data;
         const List* next;
public:  List(ListEle* d, List* n):data(d),next(n){}
         ~List(){
             if(data!=nullptr)delete data;
             if(next!=nullptr)delete next;
         }
};
#endif

我的列表将递归地删除自己是正确的吗?

然后我读到一些线程说使用递归析构函数(对于列表)最终会垃圾我的堆栈。所以我搜索了一个替代方案,发现了这样的例子:

~List(){
 delete data;
 List* delptr = next;
  while(delptr!=nullptr){
  List* temp = delptr->next;
  delete delptr;
  delptr = temp;
  }
}

如果我的想法是正确的,第二个例子也是递归的,因为"delete delptr"行。我的想法是delete delptr调用下一个列表项的析构函数,它也将创建一个"delptr",并继续为下一个项目调用析构函数。因此,我的堆栈看起来应该类似于我的第一个例子。我很确定我对删除对象的理解可能有错误。现在我觉得第二个例子中的while循环是完全没有必要的。

希望有人能帮助我澄清我的情况,

是的,您的列表将递归地删除自己。但是,如果您想删除列表中间的单个条目,则不能这样做,因为在此之后的所有元素也将被删除。

在使用其他析构函数时也会遇到同样的问题。它仍然是递归的

如果您在设计中做一个小的改变,并使用两个类会更容易:一个用于实际列表,另一个用于列表中的节点。然后让列表处理所有节点的移除/删除,并保持节点结构尽可能简单(只有数据和一个next指针,除了初始化数据和next指针的构造函数之外没有函数)。