这是我用来从链表中删除项目的伪代码:
public static void removeByID(LinkedList<Fruit> fruits, int fruitID) {
for(Fruit f : fruits) {
if (f.ID == fruitID) {
fruits.remove(f);
return;
}
}
}
我认为这不是很有效,因为fruits.remove()
将再次遍历列表。想知道是否有更好的方法来实现这一目标。
答案 0 :(得分:5)
对于java.util.LinkedList
,请使用迭代器。
Iterator<Fruit> it = fruits.iterator();
while(it.hasNext()) {
if(it.next().ID == fruitID) {
it.remove();
break;
}
}
这将导致只进行一次遍历。返回的Iterator可以访问底层链接结构,并且无需迭代即可执行删除。
当您使用for-each循环表单时,无论如何都会隐式使用Iterator。您只需保留对它的引用,以便您可以使用它的功能。
您也可以使用listIterator
进行O(n)插入。
答案 1 :(得分:3)
不,不是渐近的复杂性。这是您使用LinkedList
支付的价格:删除需要遍历列表。如果您想要更高效的东西,则需要使用不同的数据结构。
如果你有一个单独链接列表,你实际上在这里进行了两次遍历:.remove()
调用需要找到给定节点的父节点,如果没有其他遍历,它就无法完成。< / p>
答案 2 :(得分:0)
如果您需要访问具有唯一属性的集合中的元素,则最好使用HashMap,并将该属性作为键。
Map<Integer, Fruit> fruits = new HashMap<Integer, Fruit>();
// ...
Fruit f = fruits.remove(fruitID);
答案 3 :(得分:0)
如上所述,链接列表通常需要遍历任何操作。可以使用迭代器来避免多次遍历。虽然,如果你能够将水果与水果相关联。提前你可以加速你的操作,因为你可以通过缓慢的迭代查找来取消。这仍然需要不同的数据结构,即Map(可能是Hashmap)。
答案 4 :(得分:0)
关于你的帖子,使用HashMap似乎是一个很好的解决方案。 此外,如果我们假设您还需要使用fruitID将水果搜索到您的集合中,HashMap将使搜索时间几乎不变。
关于复杂性,您可以根据您使用的数据结构找到有关Simple Notions article的其他信息。