我正在尝试在Java标准的 LinkedList 上练习 MergeSort 算法。我是标准库的新手。
我遇到的问题是创建'sub-LinkedLists'以获得 MergeSort 的最佳性能。
我有一个有效的代码,但不幸的是,它把 LinkedList 当作一个数组对待:
public void mergeSort(LinkedList<Integer> lisst) {
if (lisst.size() < 2){
return;
}
int middleindex = lisst.size()/2;
LinkedList<Integer> LeftList = new LinkedList<Integer>();
for(int i = 0; i< middleindex; i++){
LeftList.addLast(lisst.get(i));
}
mergeSort(LeftList);
LinkedList<Integer> RightList = new LinkedList<Integer>();
for (int i = middleindex; i< lisst.size(); i++){
RightList.addLast(lisst.get(i));
}
mergeSort(RightList);
SortedMerge(RightList,LeftList,lisst);
}
从我一直在阅读的内容中,像这样做,杀死了对链表进行合并排序的目的。但是,实际上如何获得带有标准LinkedList类对象的子链接列表?如果是用诸如:p的节点类编写的,我可以自信地做到这一点。
node leftHead = lisst.get(middleindex);
mergeSort(lefthead);// Assuming the method also takes a node instead of LL
但是在阅读该库时,我无法弄清楚如何指向中间元素并将其余元素用作子列表,而无需循环将其添加到新的链接列表中
有没有很简单的方法来做到这一点?我没看到什么吗?
谢谢。
答案 0 :(得分:1)
如果只需要LinkedList
的正确部分,则应具有以下内容:
public static <T> LinkedList<T> removeUntil(LinkedList<T> list, int index) {
for (int i = 0; i < index; i++) {
list.removeFirst();
}
return list;
}
用例
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>(Arrays.asList(new Integer[] {1, 3, 5, 6, 9}));
System.out.format("Input : %s%n", list);
list = removeUntil(list, 3);
System.out.format("Output: %s%n", list);
}
用例输出
Input : [1, 3, 5, 6, 9]
Output: [6, 9]
如果您希望保留LinkedList
的左侧,则应改为以下内容:
public static <T> LinkedList<T>[] split(LinkedList<T> list, int index) {
LinkedList<T> left = new LinkedList<>();
for (int i = 0; i < index; i++) {
T t = list.removeFirst();
left.addLast(t);
}
return new LinkedList[] {
left, list
};
}
用例
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>(Arrays.asList(new Integer[] {1, 3, 5, 6, 9}));
System.out.format("Input : %s%n", list);
LinkedList[] alist = split(list, 3);
System.out.format("Output: %s, %s%n", alist[0], alist[1]);
}
用例输出
Input : [1, 3, 5, 6, 9]
Output: [1, 3, 5], [6, 9]
参考: