スペシャルLeetCode位のアルゴリズム単独リンクリストを回転します

問題の説明:

単一リンクリストLを考える:L 0→L 1→...→Lのn-1→L nは、
並べ替え:L 0→L→L 1→Lのn-1→L 2→L N-2→N ...
これは、インプレースアルゴリズムの使用を必要とし、ノードの値を変更しません
例えば:
{1,4,2,3}で与えられた単鎖{1,2,3,4}、のために並べ替え。
単独リンクリストLを考える:L 0→L 1→...→Lのn-1→L nは、

それを並べ替え:L 0→L N→L 1→Lのn-1→L 2→L N-2→...

あなたはノードの値を変更することなく、その場でこれを行う必要があります。

例えば、
{1,4,2,3}に並べ替える、{1,2,3,4}を考えます。

 

問題解決のアイデア:2に元のリストの分割を検討するために、ポインタは、中間ノードリストの速度を使用して見つけることができます

    そして、インプレースアルゴリズムを使用して、リストの後半部分を達成するために、反転

    そして、1つのリストに、これらの要件を達成するための二つのリストを組み合わせます

コードをコピー
/ ** 
 *単一リンクリストのための定義。
 *クラスListNode { 
 * int型のval; 
 * ListNode次。
 * ListNode(int型X){ 
 *ヴァル= X。
 *次回= NULL; 
 *} 
 *} 
 * / 
publicクラスソリューション{ 
    公共ボイドreorderList(ListNodeヘッド){ 
        IF(ヘッド== NULL || head.next == NULL){ 
            リターン。
        } 
        ListNode遅い=ヘッド。
        速いListNode =ヘッド。
        一方、(!fast.next = NULL && fast.next.next = NULL){ 
            遅い=はslow.next。
            速い= fast.next.next。
        }  
        ListNode半ば= slow.next。
        slow.next = NULL;
        = getReverse(MID)の後ListNode。
        getAdd(頭、後)。
    } 
    公共ListNode getReverse(ListNodeノード){ 
        ListNodeが予め= NULL; 
        (!ノード= NULL){一方
            node.next ListNodeのTEMP =。
            node.next =前; 
            事前=ノード。
            ノード= TEMP。
        } 
        事前返します。
    } 
    公共ボイドgetAdd(ListNodeノード1、ノード2 ListNode){ 
        ながら(!= NULLノード1 && NODE2 = NULL){ 
            = node1.next F ListNode。
            ListNode A = node2.next。
            node1.next =ノード2。
            ノード1 = F。
            node2.next =ノード1。        
            ノード2 =; 
        } 
    } 
}

おすすめ

転載: www.cnblogs.com/lc1475373861/p/12026956.html