2016-07-27 5 views
2

1 -> 2 -> 3 -> 4 -> 5のようなリンクリストがあります。私たちは1 -> 23 -> 4 -> 5を持っていると思いますm=2ためので、最後に要素番目と番目m+1からmに最初の要素から、このリンクリストを分割したい、このような何か:LinkedListを分割する

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のために使用していて、頭(h2.next = copyOfHead)のコピーを作る必要があるので、これはうまくいかないことは分かっていますが、コピーを作成しなくても、頭。

+0

言語のようなものを想像していますか? ... C#? – phonetagger

+0

@phonetagger C#、Java、問題はありません – Yar

+0

まず、あなたは 'Listnode h1 = head; Listnode h2 = head; 'ではなく、現在持っている最初の4行です。 –

答えて

2

は、私はあなたがnullでn番目のノード・ポイント(これにより、「分割」)そう、あなたその後、「開始」リストを変更する場合にのみ、先頭からヘッド

に1つのNode参照が必要だと思いますリストの残りの部分を持つ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; 
} 
関連する問題