我想复制链表中的元素。这是我尝试过的:
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;
}
}
}
但是我遇到了无限循环。
答案 0 :(得分:2)
首先,您的代码runs just fine(break
可以防止无限循环,请参见JLS-The break Statement)。
现在,您无需遍历列表,因为已经List.addAll
将指定集合中的所有元素附加到 此列表,按指定的顺序返回它们 集合的迭代器(可选操作)(...)
因此,只需doing this,您就可以了:
LinkedList <Integer> list = new LinkedList<Integer>() ;
//... code omitted (adds every number)
list.addAll(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));
}