从Java的LinkedList类获取“ sub-LinkedLlists”(出于MergeSort的目的)

时间:2018-08-30 11:08:47

标签: java linked-list

我正在尝试在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

但是在阅读该库时,我无法弄清楚如何指向中间元素并将其余元素用作子列表,而无需循环将其添加到新的链接列表中

有没有很简单的方法来做到这一点?我没看到什么吗?

谢谢。

1 个答案:

答案 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]

参考: