Java:如何在链表中添加(中间某处)多个元素?

时间:2012-07-22 14:33:12

标签: java linked-list insertion

将元素添加到链表中已知为O(1)。

然而,在位置X添加它是O(X) 如果我想在这个位置添加R元素,总运行时间将是O(R * X)。

但必须有O(X + R)解决方案。

问题是如何在java中执行O(R + X)?

3 个答案:

答案 0 :(得分:2)

您有一对(element, X)对,其中X是索引,element是您要置于该索引下的项目。按X对此列表进行排序,然后使用Iterator一个接一个地添加元素。这是一个例子:

您的输入是:[(E1, 5), (E2, 3), (E3, 7)]

  1. 按索引排序:[(E2, 3), (E1, 5), (E3, 7)]

  2. 创建一个迭代器并按3推进它。

  3. 使用迭代器添加E2

  4. 25 - 3)推进相同的迭代器。

  5. 添加E1

  6. ...

  7. 请注意,此算法存在一个错误。修复它应该相对容易。

    更新:刚刚注意到你的问题要简单得多。在你的情况下,只需创建一个迭代器,将其提前X次,然后使用该迭代器逐个添加元素。

答案 1 :(得分:2)

假设您正在使用java.util.LinkedList,则LinkedList.listIterator()方法会返回ListIterator:

  

public ListIterator listIterator(int index)

     

返回此列表中元素的列表迭代器(正确   序列),从列表中的指定位置开始。 [...]

     

list-iterator是快速失​​败的:如果列表是结构修改的   在迭代器创建之后的任何时间,除了通过之外的任何方式   list-iterator自己的remove或add方法,list-iterator会   抛出ConcurrentModificationException。 [...]

您可以使用ListIterator.add()在LinkedList的中间安全地添加项目:

  

void add(E e)

     

将指定的元素插入列表(可选操作)。 [...]

例如,假设您要将list2放在list1的第5个位置,您可以通过执行以下操作来执行此操作:

LinkedList list1 = ...;
LinkedList list2 = ...;

ListIterator it1 = list1.listIterator(5);
for (Object item : list2) {
    it1.add(item);
}

答案 2 :(得分:1)

将元素放入集合中,然后您可以使用addAll方法将它们全部添加。