LintCodeチェーンテーブル挿入ソート


1.説明
挿入ソートによるチェーンテーブルのソート
サンプル
Given 1->3->2->0->null , return 0->1->2->3->null
2.分析
挿入ソートは、配列の挿入ソートと同様に、チェーンテーブルの挿入ソートに関する一般的なソート方法の1つです.
原題はheadをヘッダノードとするチェーンテーブルを与え、次に秩序あるdummyチェーンテーブルを新規作成し、headチェーンテーブルを
のノードをdummyチェーンテーブルにそれぞれ挿入してheadチェーンテーブルのソートを完了します.順序付きチェーンテーブルで順次下に検索することを想定
元のチェーンテーブルの値と比較して、秩序チェーンテーブルの値が元のチェーンテーブルの値より大きい場合、その値を秩序チェーンテーブルに挿入します.例を挙げると
秩序チェーンテーブルには1、3があり、元のチェーンテーブルには2があります.1と2は先に比較して、1は2より小さくて、引き続き下へ探して、3は2より大きくて、この時元のチェーンテーブルを
の2を1、3の間に挿入して、最終的に秩序チェーンテーブル1、2、3を得る.
シーケンスチェーンテーブルでnode=node->nextでポインタを後方に移動し、その後の具体的な分析で重要なコードを
後ろにコメントが付いています.次のdummyチェーンテーブルは新しい秩序チェーンテーブルであり、headチェーンテーブルは元のチェーンテーブルである.秩序チェーンテーブルに戻るために、
dummyチェーンテーブルのヘッダノードdummyは動いていませんが、nodeポインタを定義しています.headチェーンテーブルでは元のチェーンテーブルに戻る必要はありません.
従って直接headをポインタとして順次下へ移動し(headポインタに戻るにはヘッダノードを保存する必要がある)、nodeポインタは
dummyチェーンテーブルの中で絶えず下に移動するポインタ、headポインタはheadチェーンテーブルの中で絶えず下に移動するポインタです.
3.コード
/**  * Definition of ListNode  * class ListNode {  * public:  *     int val;  *     ListNode *next;  *     ListNode(int val) {  *         this->val = val;  *         this->next = NULL;  *     }  * }  */class Solution { public:    /**      * @param head: The first node of linked list.      * @return: The head of linked list.      */    ListNode *insertionSortList(ListNode *head) {        //write your code here     ListNode *dummy=new ListNode(0);         while(head!=NULL)      {          ListNode *node=dummy;          while(node->next!=NULL && node->next->valval)          {node=node->next;/*nodeポインタを後ろに移動し、headチェーンテーブルの数より大きいものを見つけるまで、この数をdummyチェーンテーブルに追加します*/}ListNode*temp=head->next;/*headを元のチェーンテーブルのポインタとして順番に下に探して、whileループを飛び出したときに調べたこのheadはnodeより優れている.next大*/head->next=node->next;//ヘッドをnodeに挿入するnext前node->next=head;//ヘッドをnodeに挿入した後、ヘッドをnodeとnodeに挿入します.next間head=temp;//元head.nextは新しいheadとなってループ検索を継続}return dummy->next;    } };
4.まとめ
チェーンテーブルを操作するときに大きな特徴があります.head->nextの変化は必ず最後にしなければなりません.headノードが与えられた場合
head->nextはランダムに決定され、head->nextは次のノードであるが、このノードを早すぎると見つからない.
赤字部分コードもhead->nextをtempに保存し、その後一連の操作をした後head->nextのアドレスが変更され、
しかしtempは元headの次のノードを残した.
同時に、単一チェーンテーブルはnextで支持され、新しい要素を挿入すると、2を1と3に挿入すると、元の関係は1->next=3である.
挿入後は1−>next=2,2−>next=3となり,前の2つのノード間の関係を断ち切った上で新しい2つの関係を確立する.