用于链表节点的RAII样式C++类

Dav*_*ill 4 c++ algorithm memory-management raii

我现在正在玩链接列表作为练习.

我在Cracking The Coding Interview书中看到的例子中没有LinkedList(管理器)类,只有Nodes,你可以在主函数中挂起头节点.

我查找了C++实现,但大多数似乎比C++更C风格,即不是面向对象的.它们使用结构体,没有类,并且有一个静态方法来删除列表,您需要明确记得调用它.我想写一个合理的RAII(资源获取是初始化)风格的C++类,带有合理的析构函数来处理内存释放,我想只使用一个Node类(没有LinkedList类).

我看到有这个工作的唯一方法是让Node的析构函数删除下一个Node,如果有的话,但是我已经读过这种递归删除是一个坏主意,因为你最终创建了一个与之相同长度的callstack.链表.

总结一下我的问题:

  • 如果编写一个面向对象的类来处理C++中的链表,你是否必须有一个LinkedList(manager)类来处理它的析构函数中列表节点的删除?
  • 如果没有,你将如何处理节点的破坏?

谢谢!

Mik*_*our 6

如果编写一个面向对象的类来处理C++中的链表,你是否必须有一个LinkedList(manager)类来处理它的析构函数中列表节点的删除?

不,结构由节点之间的链接定义,因此不需要单独的管理器对象.有时候有一个更方便,特别是如果你正在设计像STL这样的库并希望所有容器都有类似的接口,但你当然可以用一个节点类型实现一个链表.

如果没有,你将如何处理节点的破坏?

避免递归的一种方法是在删除之前从列表中删除每个节点,例如:

~node() {
    while (node * victim = next) {
        next = victim->next;
        victim->next = nullptr;
        delete victim;
    }
}
Run Code Online (Sandbox Code Playgroud)