好了,所以我有一個任務,它是這樣的:ArrayIndexOutOfBoundsException異常,當一個LinkedList
Assume you have as input a singly-linked list containing N items (an instance of a LinkedList class in Java). You should rearrange the items in the LinkedList uniformly at random. Your algorithm should consume a logarithmic (or constant) amount of extra memory and run in time proportional to NlogN in the worst case.
對於算法我去了歸併,當其合併以隨機的方式這樣做。我不知道該怎麼做,我不知道該怎麼辦甚至可以肯定我以正確的方式做到這一點。
代碼:
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)
你能告訴我們你得到的錯誤嗎?如果可能的話,複製/粘貼整個堆棧跟蹤。 – 2014-09-30 16:49:27
@CoryKlein編輯我的文章,它現在包括錯誤 – Necrozze 2014-09-30 17:09:20
只是一個無關的評論:我不認爲創建輸入列表的副本滿足任務要求*算法應該消耗對數(或恆定)量的額外內存* – Durandal 2014-09-30 18:02:27