有两种已知的方法(只有两种?)来删除前向链表
一种方法是递归函数效率低,如果列表太大会导致堆栈溢出
另一种方式(高效)是一个迭代和删除节点的函数:
class Forward_list {
public:
// Constructor...
~Forward_list() { if(head) destroy(); }
void destroy() {
node* prev = nullptr;
while (head) {
prev = head;
head = head->next;
delete prev;
}
}
// functions...
private:
// data members...
node* head;
};
现在这样做:
class Forward_list {
public:
// Constructor...
~Forward_list() { if(head) delete this->head; }
// functions...
private:
struct node {
~node() { delete this->next; } // <- this way
type data;
node* next;
};
node* head;
// data members...
};
我测试了它并且工作正常...我发现这种方式更干净但不确定是否会有副作用?
答案 0 :(得分:3)
您的解决方案在技术上是正确的,我能想到的唯一问题是您无法删除一个节点而不删除后面的所有节点。
答案 1 :(得分:2)
~node() { delete this->next; } // <- this way
我发现这种方式更干净但不确定是否会有副作用?
嗯,&#34;副作用&#34; 将是,你不能从列表中删除任何节点,而不删除列表的其余部分,因为{ {1}}在那里递归调用。
这可能不是你想要做的。
答案 2 :(得分:2)
由于以前没有提及:使用时
delete this->next;
请注意,递归调用析构函数,即delete
析构函数中的下一个节点的方法等同于delete
列表的递归方法。递归并不那么直接和明显。