拆分LinkedList

时间:2016-07-27 21:35:39

标签: algorithm oop data-structures linked-list

假设我有一个链接列表,例如1 -> 2 -> 3 -> 4 -> 5。我想将这个链表从第一个元素拆分为m th 元素,并从m+1 th 拆分到结尾,所以对于{{ 1}}我们有m=21 -> 2,类似这样:

3 -> 4 -> 5

我知道这不起作用,因为我对private ListNode split(ListNode head, int m) { ListNode h1 = new ListNode(0); ListNode h2 = new ListNode(0); h1.next = head; h2.next = head; // same reference: error! ListNode cur1 = h1; ListNode cur2 = h2; for (int i = 0; i < m; i++) { cur1 = cur1.next; } cur1.next = null; ListNode tmp = cur2.next; for (int i = 0; i < m; i++) { tmp = tmp.next; } cur2.next = tmp; // doesn't matter which one to return return h2.next; } 使用了相同的引用(head),我需要复制一个头部(h2),但是我想知道是否有一个更好,更有效的解决方案,而无需复制头部。

1 个答案:

答案 0 :(得分:2)

我认为你只需要一个节点引用头

从头开始,如果修改“起始”列表,使n - 节点指向null(从而“拆分”),则返回n+1节点,该节点具有列表的其余部分。

我在想像这样的东西

private ListNode split(ListNode head, int m) {

    ListNode tmp = head;
    // Additionally check that you don't go beyond the list
    for (int i = 0; tmp.next != null && i < m; i++) {
        tmp = tmp.next;
    }

    ListNode remainder = tmp.next;
    tmp.next = null;

    return remainder;
}