【发布时间】:2014-11-25 09:13:39
【问题描述】:
好的,所以我有一个任务,它是这样的:
假设您有一个包含 N 的单链表作为输入 items(Java 中 LinkedList 类的实例)。您应该重新排列 LinkedList 均匀随机。您的算法应该使用对数(或 常数)额外内存的数量和在最坏情况下与 NlogN 成正比的运行时间 案例。
对于算法,我打算使用合并排序,当它合并时,它会以随机方式进行。
但是我的程序被卡住了,因为它抛出了一个ArrayIndexOutOfBoundsException,但它不在我的代码中,而是在 LinkedList.java 中
我对 LinkedList 不是很熟悉,所以我不知道该怎么做,我什至不确定我这样做的方式是否正确。
代码:
import java.util.LinkedList;
public class Q02 {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
list.add(9);
list.add(0);
System.out.println("Shuffled list: "+shuffle(list));
}
public static LinkedList shuffle(LinkedList list){
int node = 10; //just a random node
if(list.size()<=1){
return list;
}
LinkedList<Integer>list1 = new LinkedList<>();
LinkedList<Integer>list2 = new LinkedList<>();
while(!list.isEmpty()){
list1.add((Integer) list.removeFirst());
if(!list.isEmpty()){
list2.add((Integer) list.removeFirst());
}
}
shuffle(list1);
shuffle(list2);
if(list2.size() < list1.size()){
int i = (int)(Math.random() * list2.size());
list2.set(i, node);
}
while(!list1.isEmpty()&&!list2.isEmpty()){
int rand = (int)(Math.round(Math.random()));
if(rand == 1){
list.add(list1.removeFirst());
}
else if(rand == 0){
list.add(list2.removeFirst());
}
}
//If any of list1 or list2 are still empty add everything to list
if(!list1.isEmpty()){
list.add(list2.clone());
}
if(!list2.isEmpty()){
list.add(list1.clone());
}
list.remove(node);
return list;
}
}
这里是错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 10, Size: 2
at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
at java.util.LinkedList.remove(LinkedList.java:523)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:62)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:39)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:39)
at kth.id2010.lab.lab03.Q02.Q02.shuffle(Q02.java:39)
at kth.id2010.lab.lab03.Q02.Q02.main(Q02.java:22)
【问题讨论】:
-
您能告诉我们您遇到的错误吗?如果可能,复制/粘贴整个堆栈跟踪。
-
@CoryKlein 编辑了我的帖子,它现在包含错误
-
只是一个无关的评论:我认为创建输入列表的副本不能满足任务要求算法应该消耗对数(或恒定)量的额外内存
-
@Durandal 实际上确实如此,因为我将其复制到 2 个不同的列表中,消耗的额外内存量是 logN,它是对数。
标签: java algorithm linked-list indexoutofboundsexception