编写LinkedList析构函数?

kev*_*vin 13 c++ destructor linked-list

这是一个有效的LinkedList析构函数吗?我仍然对他们感到困惑.

我想确保我正确理解这一点.

 LinkedList::~LinkedList()
 {
   ListNode *ptr;

   for (ptr = head; head; ptr = head)
   {
     head = head->next
     delete ptr;
   }
}
Run Code Online (Sandbox Code Playgroud)

因此,在循环开始时,指针ptr被设置为保存head的地址,即列表中的第一个节点.然后将head设置为下一个项目,该项目将在第一次删除后成为列表的开头.ptr被删除,第一个节点也是如此.在循环的第一次迭代中,指针再次设置为head.

关注我的事情是到达最后一个节点.条件"头;" 应检查它是否为空,但我不确定它是否会起作用.

任何帮助赞赏.

sha*_*oth 17

为什么不做得更简单 - 使用优雅的while-loop而不是试图仔细分析过度for编译的循环是否正确?

ListNode* current = head;
while( current != 0 ) {
    ListNode* next = current->next;
    delete current;
    current = next;
}
head = 0;
Run Code Online (Sandbox Code Playgroud)

  • @Matthieu M.:没有糟糕的双关语.请您详细说明"永不改变"和"从未使用过"? (6认同)

pax*_*blo 5

您可以通过调试器运行它,或者您可以通过头骨内的那些湿软件运行它 - 两者都会向您显示它工作正常.例如,让我们从列表开始:

head(47) -> [47]single_node -> [NULL]end-of-list.
Run Code Online (Sandbox Code Playgroud)

通过语句运行该列表:

  • ptr = head设置ptr到47.
  • head 是非零所以进入循环.
  • head = head->next设置head为NULL.
  • delete ptr将删除single_node.
  • ptr = head设置ptr为NULL.
  • head 现在是NULL(0)所以退出循环.

你去了,你删除了列表中唯一的条目,head现在设置为NULL.这就是你需要做的.

你可以用更长的列表或空列表做类似的事情,你会发现它仍然没问题(单元素列表和50元素列表之间没有真正的区别).

顺便说一句,我不是把指针视为布尔的忠实粉丝 - 我宁愿把它写成:

for (ptr = head; head != NULL; ptr = head)
Run Code Online (Sandbox Code Playgroud)

在我看来,它使代码读得更好,你并没有真正牺牲任何性能(除非你有一个脑死亡的编译器).但那是品味问题.

你的评论:

关注我的事情是到达最后一个节点.条件"头;" 应检查它是否为空,但我不确定它是否会起作用.

它会工作.零值将被视为false,因此你会发现你永远不会取消引用head-> next当head为NULL时,因为你将在该点之前退出循环体(如果列表为空则甚至不进入正文) ).

任何其他指针值将被视为true,您将进入或继续循环体.