在链接列表中的指定元素之前插入一个元素

时间:2019-04-28 03:43:26

标签: java linked-list time-complexity

如何在链表中的指定元素之前插入元素,以使时间复杂度为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

2 个答案:

答案 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);

此代码假定:

  1. linkedList存在并且是LinkedList<Integer>
  2. beforeTheNumberaddNumber存在并且是整数。

如果linkedList没有beforeTheNumber,则将addNumber添加到末尾。