Java:删除链接列表中的所有元素

时间:2011-04-14 04:16:48

标签: java linked-list

在Java中,如何使用已有的 clear() 方法删除链接列表中没有的所有元素?这项练习的灵感来自于电话采访中收到的一个问题。

说我可以用C

做到这一点
void DeleteAllElement( ListElement **head ) {  
    ListElement *deleteMe = *head;  
    while( deleteMe )  {  
        ListElement *next = deleteMe->next;  
        delete deleteMe;  
        deleteMe = next;  
    }  
    *head = NULL;  
}

由于

4 个答案:

答案 0 :(得分:11)

Java具有自动垃圾收集功能,因此您只需将Head引用设置为null:

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节点设为私有,我们可以简单地执行我发布的第一个代码段。

答案 1 :(得分:8)

如果您正在谈论java.util.LinkedList的实例:

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

如果您正在讨论任何java.util.List的实例:

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

请记住remove是一项可选操作。但是,根据列表实现,这可能非常有效。对于ArrayList,这会更好:

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

另一种选择是迭代列表并在每个元素上调用Iterator.remove() ...也是一个可选操作。 (但是,对于某些列表实现,这可能会非常低效。)

如果您正在讨论自定义链表类,那么答案取决于您声明列表类内部数据结构的方式。


我怀疑如果访调员提到clear()方法,他们期望在标准Java集合框架的上下文中找到答案......而不是自定义链表类。

答案 2 :(得分:1)

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

或查看this example

答案 3 :(得分: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会以任何方式清除eup,而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;
}