問題の説明:
単一リンクリスト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 =; } } }