如何在链表中的指定元素之前插入元素,以使时间复杂度为n。 例如 我想在7之前插入100
LinkedList<Integer> linkedList = new LinkedList<>();
for (int i = 1; i <= 10; i++) {
linkedList.add(i);
}
我可以这样做
int index = linkedList.indexOf(7);
if (-1 != index) {
linkedList.add(index, 100);
}
但是我以此方式遍历了两次链表。
实际上,我们可以只遍历一次就可以做到这一点。
那怎么办呢?
PS:只需使用LinkedList
答案 0 :(得分:1)
有一种方法可以ListIterator
一次完成。 ListIterator
就像常规的Iterator
一样,除了可以更改迭代的方向,还可以add
在当前位置的元素。参见javadoc。
所以代码如下:
LinkedList<SomeType> list = ...
SomeType a, b = ..
// Insert 'b' before the first element equal to 'a' in 'list'
ListIterator<SomeType> iterator = list.listIterator(0);
while (iterator.hasNext()) {
SomeType e = iterator.next();
if (e.equals(a)) {
iterator.previous(); // returns 'e' again. But the real purpose
// is to reset the iteration position
// so that 'next()' would return 'e' again.
iterator.add(b); // inserts before 'next()'.
break;
}
}
ListIterator::add
操作是“可选”操作,但LinkedList
支持。 LinkedList
javadoc说上述内容不会引起ConcurrentModificationException
。
答案 1 :(得分:0)
如何?
LinkedList<Integer> linkedList = new LinkedList<>();
int addNumber = 100, beforeTheNumber = 7;
for(int i = 1; i <= 10; i++) {
if(i == beforeTheNumber)
linkedList.add(addNumber);
linkedList.add(i);
}
linkedList
的要素现在应显示为:1,2,3,4,5,6,100,7,8,9,10
。
编辑::要在已经存在的LinkedList
中插入一些值:
linkedList.add((linkedList.indexOf(beforeTheNumber) >= 0 ? linkedList.indexOf(beforeTheNumber) : linkedList.size()), addNumber);
此代码假定:
linkedList
存在并且是LinkedList<Integer>
。beforeTheNumber
和addNumber
存在并且是整数。如果linkedList
没有beforeTheNumber
,则将addNumber
添加到末尾。