2011-04-14 80 views
4

在Java中,如何使用已有的clear()方法刪除鏈接列表中的所有元素而不使用?這項練習的靈感來自於電話採訪中收到的問題。Java:刪除鏈接列表中的所有元素

我可以用C

執行此操作
void DeleteAllElement(ListElement **head) { 
    ListElement *deleteMe = *head; 
    while(deleteMe) { 
     ListElement *next = deleteMe->next; 
     delete deleteMe; 
     deleteMe = next; 
    } 
    *head = NULL; 
} 

謝謝

+0

縮進每行4個空格以獲得自動「代碼」塊。有一個工具可以做到這一點:選擇線條並點擊'{}'圖標。 – 2011-04-14 04:35:25

+0

刪除我的答案,但真的,爲什麼不使用clear()。這就是它的目的。爲什麼重新發明輪子? – squawknull 2011-04-14 04:35:41

+0

因爲我在電話採訪中被問到 – SuperMan 2011-04-14 04:36:19

回答

11

Java提供了自動垃圾收集,所以你只需要設置元首參考空:

myList.headNode = null;

所以,我們假設我們有LinkedList類,它也有resetList函數...

public class LinkedList{ 
    private Node head; 
    public Node find(Key k){ ... } 
    public void add(Node n){ ... } 
    ... 
    public void reset(){ head = null;} 
    public static void reset(LinkedList l){l.reset();} 
} 

如果我們沒有將head節點設置爲私有,我們可以簡單地執行我發佈的第一個代碼片段。

+0

我已經寫過我的java代碼,可以用它來表達嗎? – SuperMan 2011-04-14 04:57:27

+1

您需要將列表的引用設置爲空,而不是傳遞的引用。 'DeleteAllElement'應該接受列表,而不是頭節點,並將列表的頭部設置爲'null'。否則,實際列表將保留其對現有頭部的參考。 – bdares 2011-04-14 05:02:59

+0

注意在你的答案中的代碼形式的措辭,所以我可以接受它? – SuperMan 2011-04-14 05:05:27

1
for(i=0;i<linkedlist.size;i++){ 
linkedlist.removeFirst(); 
} 

或看到this example

7

如果你正在談論的java.util.LinkedList一個實例:

while (!linkedlist.isEmpty()) { 
     linkedlist.removeFirst(); 
    } 

如果你正在談論任何java.util.List的一個實例:

while (!list.isEmpty()) { 
     list.remove(0); 
    } 

軸承記住remove是一個opti正常運行。但是,根據清單的實施情況,這可能非常有效。對於ArrayList這會更好:

while (!list.isEmpty()) { 
     list.remove(list.size() - 1); 
    } 

另一種方法是遍歷列表,每個元素......還有一個可選操作上調用Iterator.remove()。 (但是,再次說明,對於某些列表實現來說這可能是非常低效的)。

如果您正在討論自定義鏈表類,那麼答案取決於您聲明列表類的內部數據結構的方式。


我懷疑,如果面試官提到的clear()方法,他們期待在標準的Java集合框架...不是一個自定義的鏈表類的上下文答案。

1

閱讀實際的代碼很有用。我建議你看看。

對於單向鏈表,您可以僅做爲@bdares,當您查看java.util.LinkedList的實際代碼(這是大多數開發人員使用的代碼)時,建議的答案很不相同。

public void clear() { 
    Entry<E> e = header.next; 
    while (e != header) { 
     Entry<E> next = e.next; 
     e.next = e.previous = null; 
     e.element = null; 
     e = next; 
    } 
    header.next = header.previous = header; 
    size = 0; 
    modCount++; 
} 

首先要注意的是;這是用於前向和後向遍歷的雙向鏈表,並且它極力清除所有參考。不知道爲什麼這樣做是值得尊重的,因爲GC會以任何方式清除它,並且modCount會在另一個線程中發現任何更改。實際上它應該首先執行modCount。

爲了比較,這裏是ArrayList.clear();

public void clear() { 
    modCount++; 

    // Let gc do its work 
    for (int i = 0; i < size; i++) 
     elementData[i] = null; 

    size = 0; 
}