Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从链表中查找和删除元素的最佳方法_Java_Linked List_Doubly Linked List - Fatal编程技术网

Java:从链表中查找和删除元素的最佳方法

Java:从链表中查找和删除元素的最佳方法,java,linked-list,doubly-linked-list,Java,Linked List,Doubly Linked List,我一直在想这个问题已经有一段时间了,但还没有找到一个很好的答案 我想做的是在链表中找到一个元素并立即删除它。如果我自己构建链表,这将很容易,因为我必须遍历双链表: -> N1 <-> N2 <-> N3 <-> N4 <-> N5 <- 如果元素是列表中的中间元素(双链接列表,因此如果索引已知,理论上可以从列表末尾进行搜索),则最多需要大约n/2+n/2=n个步骤。而在自制的导线测量中,只需要n/2步 我知道那些2和其他的方法都是O(

我一直在想这个问题已经有一段时间了,但还没有找到一个很好的答案

我想做的是在链表中找到一个元素并立即删除它。如果我自己构建链表,这将很容易,因为我必须遍历双链表:

-> N1 <-> N2 <-> N3 <-> N4 <-> N5 <-
如果元素是列表中的中间元素(双链接列表,因此如果索引已知,理论上可以从列表末尾进行搜索),则最多需要大约n/2+n/2=n个步骤。而在自制的导线测量中,只需要n/2步

我知道那些2和其他的方法都是O(n),但是你知道,有时候n/2在实践中会产生不同


谢谢您的帮助。

Java8将为您完成此任务

list.removeIf(x -> hasCertainProperty(x));
这将在列表内部循环,检查每个项目
x
是否满足您的条件
hasCertainProperty
,并删除该项目。我想你不应该担心演出。Java将为您处理它

除此之外,您应该使用
ListIterator
,它正是为此目的而设计的。您可以通过以下方式获得:

ListIterator listIter=list.ListIterator(0);
while(listIter.hasNext()){
整型元素=listIter.next();
if(hasCertainProperty(元素)){
listIter.remove();
打破
}
}

它的
remove
不需要任何查找,因为它在迭代时维护指向节点的指针。因此,它在您要删除的节点上有手。

为什么需要该循环?只需调用remove(Object)java.util.LinkedList即可:这是为了简化。假设它是一个更复杂的对象,我只想比较某个属性,我不能使用remove,因为我必须通过更复杂的比较找到要删除的对象。我更新了问题,希望更清楚now@AndiR在这种情况下,地图将是一个更好的数据结构使用。谢谢,这正是我要找的!出于好奇:在Java8之前有没有解决方案?@AndiR是的,同样的
removeIf
在内部工作。通过使用
列表迭代器
。这也是处理
LinkedList
的正确方法,如果您想使用它的属性并避免第二次查找以进行删除。
Integer found = null;
for(Integer elem : list){
    if(hasCertainProperty(elem)){
        found = elem;
    } 
}
if(found != null){
    list.remove(found);
}
list.removeIf(x -> hasCertainProperty(x));
ListIterator<Integer> listIter = list.listIterator(0);
while (listIter.hasNext()) {
    Integer element = listIter.next();

    if (hasCertainProperty(element)) {
        listIter.remove();
        break;
    }
}