在Java中插入LinkedList的中间

时间:2016-07-24 06:23:02

标签: java linked-list time-complexity

想象一下,你有一个LinkedList插入元素{A,B,C,D,E,F},这些操作是 O (1)现在我想回到开始并添加{G,H,I},以便最终的LinkedList看起来像:{G,H,I,A,B,C,D,E,F}。

我可以使用list.add(index, content)执行此操作,但是这非常低效,因为每个操作都是 O N )。后来我想继续加尾。我确信有一种方法可以在 O (1)时间内完成所有这些操作,而不需要创建我自己的链表,我只是不知道如何。

编辑:所以我真的想知道Java是否有一些排序迭代器/指针,我可以从那里插入 O (1),例如i = 3 {A, B,C,^ D,E,F},插入{G},{H},{I}会使列表看起来像{A,B,C,G,H,I,D,E,F}。 list.addAll有效,但我必须先创建一个列表。如果存在这种方法,我不想在不知情的情况下继续进行。

最后我要问这个问题来解决这个Uva法官problem我知道如何解决它,但如果不能推广其他场景我什么都不学。

1 个答案:

答案 0 :(得分:6)

根据Javadoc

  

List和Deque接口的双链表实现。

     

所有操作的执行都与双向链表一样。索引到列表中的操作将从开头或结尾遍历列表,以较接近指定索引为准。

关于你的担忧:

  

我可以使用list.add(index,content)来做到这一点,但是由于每个操作都是O(N),因此效率非常低。后来我想继续加尾。

事实并非如此。在列表的开头或结尾插入元素的目的是 O (1)运行时。因此没有什么可担心的。

编辑:在阅读UVa问题描述后,我上面的答案仍然存在。此外,我想补充说,解决问题的一个好方法是一次添加整个文本字符串,而不是一次添加一个字符。两个家庭/结束按键之间的所有字符应被视为单个不可破解的字符串。然后我们将这些字符串添加到LinkedList<String>的开头或结尾,而不是LinkedList<Character>。仍然没有必要担心插入中间,也没有必要有一个虚构的插入迭代器。