我一直想知道这个问题已经有一段时间了,在SO上还没有找到一个好的答案。
我想做的是在链表中找到一个元素并立即将其删除。如果我自己构建链表,那将很容易,因为我只是遍历双重链表:
-> N1 <-> N2 <-> N3 <-> N4 <-> N5 <-
Run Code Online (Sandbox Code Playgroud)
当找到例如N3时,可以更改node.previous和node.next指针,例如:
-> N1 <-> N2 <-> N4 <-> N5 <-
Run Code Online (Sandbox Code Playgroud)
如果元素在中间,则大约需要2个步骤。
是否有适当的方法可以做到这一点java.util.LinkedList<Integer>?
对我来说不足的方法是:
Integer found = null;
for(Integer elem : list){
if(hasCertainProperty(elem)){
found = elem;
}
}
if(found != null){
list.remove(found);
}
Run Code Online (Sandbox Code Playgroud)
如果该元素是列表中的中间元素(双链表,则从理论上讲,如果知道索引,则可以从列表末尾进行搜索),它最多需要大约n / 2 + n / 2 = n个步长。而在自制遍历中,只需要n / 2步。
我知道这2种方法和其他方法都在O(n)中,但是您知道,有时n / 2在实践中会有所不同。
谢谢你的帮助。