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)
您可以通过调试器运行它,或者您可以通过头骨内的那些湿软件运行它 - 两者都会向您显示它工作正常.例如,让我们从列表开始:
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,您将进入或继续循环体.
| 归档时间: |
|
| 查看次数: |
56152 次 |
| 最近记录: |