重复链表

时间:2019-05-08 10:00:45

标签: java list for-loop linked-list

我想复制链表中的元素。这是我尝试过的:

public class duplicate  {
      public static void main(String[] args) {

        LinkedList <Integer> list = new LinkedList<Integer>() ;
        list.add(2); 
        list.add(3); 
        list.add(4); 
        list.add(1); 
        list.add(0); 

        for( int i= 0 ; i<list.size(); i++) {   
          list.addAll(list);
          System.out.println(list);
          break; 
        }

      }
    }

但是我遇到了无限循环。

3 个答案:

答案 0 :(得分:2)

  

将指定集合中的所有元素附加到   此列表,按指定的顺序返回它们   集合的迭代器(可选操作)(...)

因此,只需doing this,您就可以了:

LinkedList <Integer> list = new LinkedList<Integer>() ;
//... code omitted (adds every number)
list.addAll(list);
  • 但是,如果您想使用List.add而不是List.addAll,可以使用like this(需要使用 for-loop ):

    LinkedList <Integer> list = new LinkedList<Integer>() ;
    //... code omitted (adds every number)
    int initialSize = list.size();
    for( int i = 0 ; i < initialSize; i++) {   
      list.add(list.get(i));
    }
    
    System.out.println(list);
    

答案 1 :(得分:0)

您正在for循环中一次又一次地添加列表元素。

for(int i= 0 ; i < list.size(); i++) {   
   list.addAll(list);
   System.out.println(list);
}

每次都会增加&导致每次迭代的大小都会增加。更正该步骤。使用局部变量存储大小或更改逻辑

答案 2 :(得分:0)

您只需执行list.addAll(list);

如果您想使用add方法作为练习,则在开始进行迭代之前,需要小心保存列表的原始大小。您可以在for循环的初始化部分中完成此操作:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>(Arrays.asList(2, 3, 4, 1, 0));
    for (int i = 0, size = list.size(); i < size; i++)
        list.add(list.get(i));
    System.out.println(list);
    assert list.equals(Arrays.asList(2, 3, 4, 1, 0, 2, 3, 4, 1, 0));
}

现在,您会注意到上面使用的是ArrayList,而不是LinkedList。通常,您应该首选ArrayList。甚至Java的LinkedList says he doesn't use it的作者。另请参见this SO question about ArrayList vs LinkedList

如果您必须使用LinkedList,则只需将上面的第二行替换为:

    List<Integer> list = new LinkedList<>(Arrays.asList(2, 3, 4, 1, 0));

其余代码可以保持不变。但是,如果列表很长,则使用get(index)类的LinkedList方法会降低性能。使用LinkedList,如果您进行迭代(使用LinkedList.iterator()增强的for循环),则比使用get()的普通for循环获得更高的性能。但是您不能在添加列表的同时对其进行迭代,这时您将获得ConcurrentModificationException。相反,您可以将链接列表复制到数组,然后在添加列表的同时对其进行迭代:

public static void main(String[] args) {
    List<Integer> list = new LinkedList<>(Arrays.asList(2, 3, 4, 1, 0));
    for (Integer element : list.toArray(new Integer[0])) {
        list.add(element);
    }
    System.out.println(list);
    assert list.equals(Arrays.asList(2, 3, 4, 1, 0, 2, 3, 4, 1, 0));
}