在LinkedList中按索引删除

时间:2011-02-28 02:46:56

标签: java linked-list

这不是我在现实生活中会做的事情,而是说:

LinkedList = a,b,c,d,e我得到了相应的索引。

说,我想删除b (index=1) and d (index=3)(即c (index=j=2)周围的值)

现在,我做(工作正常):

When j=2
LS.remove(j + 1); ----> j=3 (d removed)
LS.remove(j - 1); ----> j=1 (b removed)

b and d已删除。

但如果,我这样做(不起作用):

When j=2
LS.remove(j - 1); ----> j=1 (b removed)
LS.remove(j); ----> j=2 (d is not removed) (used j because due to above removal, LL has adjusted it self)

即。当我首先移动'c'之前的值时,'d'不会被移除,并且LL保持不变。我想,我也在做同样的事情。

我错过了什么吗?

更新

因此,当我更改签名public void operation(String operator, Integer j) to public void operation(String operator, int j)时,它就有用了。

3 个答案:

答案 0 :(得分:5)

如果j类型为大Integer,则会调用LinkedList.remove(Object)而不是LinkedList.remove(int)。这不是你真正想要的。

我没有看到任何理由在第二个示例中使用big-Integer作为j的类型,您应该使用原始int

请检查Why aren't Java Collections remove methods generic? LinkedList仍有remove(Object)签名的原因。

答案 1 :(得分:2)

当您修改列表时,通过索引引用列表元素是一种毛茸茸的事情 - 因此索引与元素之间的关系正在发生变化。这就是为什么在Java中,java.util.List有一个方法List.listIterator(),给出java.util.ListIterator。有了这个,你可以写一个像这样的方法:

void removeAdjacent(List<?> list, Object o) {
    ListIterator<?> listIt = list.listIterator();
    while (listIt.hasNext()) {
        if (listIt.next().equals(o)) {
            // set the iterator back to the element we just checked
            listIt.previous();
            // remove previous if it exists
            // and set the iterator again to this element
            if (listIt.hasPrevious()) {
                listIt.previous();
                listIt.remove();
                listIt.next();
            }
            // remove next if it exists
            if (listIt.hasNext()) {
                listIt.next();
                listIt.remove();
            }
        }
    }
}

答案 2 :(得分:1)

你错过了什么。这个完整的程序产生了预期的结果:

import java.util.LinkedList;
public class Foo {
   public static void main(String []argv) {
      LinkedList<String> l = new LinkedList<String>();
      l.add("a");
      l.add("b");
      l.add("c");
      l.add("d");
      l.add("e");
      int j = 2;
      l.remove(j - 1);
      l.remove(j);
      System.out.println(l.toString());
   }
}

结果是:

[a, c, e]