将元素添加到链表中已知为O(1)。
然而,在位置X添加它是O(X) 如果我想在这个位置添加R元素,总运行时间将是O(R * X)。
但必须有O(X + R)解决方案。
问题是如何在java中执行O(R + X)?
答案 0 :(得分:2)
您有一对(element, X)
对,其中X
是索引,element
是您要置于该索引下的项目。按X
对此列表进行排序,然后使用Iterator
一个接一个地添加元素。这是一个例子:
您的输入是:[(E1, 5), (E2, 3), (E3, 7)]
。
按索引排序:[(E2, 3), (E1, 5), (E3, 7)]
创建一个迭代器并按3
推进它。
使用迭代器添加E2
。
按2
(5 - 3
)推进相同的迭代器。
添加E1
。
...
请注意,此算法存在一个错误。修复它应该相对容易。
更新:刚刚注意到你的问题要简单得多。在你的情况下,只需创建一个迭代器,将其提前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方法将它们全部添加。