2016-05-29 30 views
2

有两种已知的方式(只有两个?),删除前链表删除前链表

  1. 一种方法是递归函数效率低且会给堆栈溢出如果列表太大

  2. 的另一种方式(有效)是迭代并删除节点这样的功能:

    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... 
}; 

我测试,它工作得很好......我觉得这种方式更清洁,但不知道是否会有副作用吗?

+1

如果您只想删除一个节点,该怎么办? – PaulMcKenzie

+1

@PaulMcKenzie:首先从列表中取消链接,它将'node-> next'设置为'nullptr',使'delete this-> next'成为无操作。 – MSalters

回答

3

您的解决方案在技术上是正确的,我能想到的唯一问题是无法删除一个节点而不删除所有后续节点。

+0

很好的捕获...没想到,因为我没有实现整个清单... – Laith

+0

@Leo为什么高代表用户很可能被忽略? :-(... –

+0

@πάνταῥεῖ这个答案在我看来首先...我没有忽视你,我无论如何都+1了你 – Laith

2
~node() { delete this->next; } // <- this way 

,我觉得这种方式更清洁,但不知道是否会有副作用吗?

嗯,“副作用”会,你不能从列表中删除任何节点,但不删除列表中所有的剩余,因为~node()被称为递归那里。

这可能不是你想要做的。

+0

我不知道我是怎么错过了这个... – Laith

2

既然不前面提到的:使用

delete this->next; 

时注意的是,析构函数被递归调用,即,delete荷兰国际集团在析构函数下一个节点的做法等同于递归方法的delete列表。递归只是不那么直接和明显。