2016-05-29 66 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列表。遞歸只是不那麼直接和明顯。