从Java LinkedList中有效地删除项目

时间:2014-10-31 16:19:24

标签: java linked-list

这是我用来从链表中删除项目的伪代码:

public static void removeByID(LinkedList<Fruit> fruits, int fruitID) {
    for(Fruit f : fruits) {
      if (f.ID == fruitID) {
         fruits.remove(f);
         return;
      }
    }
}

我认为这不是很有效,因为fruits.remove()将再次遍历列表。想知道是否有更好的方法来实现这一目标。

5 个答案:

答案 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的其他信息。