重複ノードを削除するには、リストの安全性を証明するために[オファー]

タイトル説明

ソートされたリンクリストのノードが重複して、重複したノードのリストを削除し、ノードが繰り返さ保持していない、ヘッド・ポインタ・リストを返します。例えば、リスト4-> 5が処理され> 2-> 3-> 3-> 4-> 1- 1-> 2-> 5

分析:

執筆のための2つの方法がありますが、アイデアは、リストを横断して、重複ノードを削除しています

1を書き込む:非再帰的、指ビス

1)ダミーヘッドノードp、取り扱いの容易さを加えます

2)設定二つのポインタは、現在最後次=>最初と最後の、現在を指すように最初のノード、最後と次のノードの異なる値が、現在のノードを見つけるために移動し、初段であります

/ * 
構造体ListNode { 
    int型のVal、
    構造体*次ListNode; 
    ListNode(int型X):
        ヴァル(X)、次に(NULL){ 
    } 
}; 
* / 
クラスソリューション{
 パブリック
ListNode * deleteDuplication(ListNode * PHEAD)
{ 
    // 仮想第1ノードPの増加 
    * P = ListNodeを新しい新しい - (ListNode 。1 ;)
    P - >次に= PHEAD; 
    
    // 最初のノード点を現在のノードの現在の、最後の後退異なるノードへと検索値の 
    最初* ListNode = P; 
    ListNode * =最終PHEAD、

    しばらく(最終= NULL &&最終- >次=!! NULL)
    {
         X)もし(!直前に入って>ヴァル=直前に入っ>ネクスト> ヴァル)
        { 
            最初 = 最後。
            最後 =直前に入って> 次。
        } 
        { 
            int型 X =直前に入って> ヴァル。
            一方、(!直前に入って>次= NULL)
            { 
                場合(直前に入って>ヴァル== X)
                { 
                    最後 =直前に入って> 次。
                } 
                { 
                    破ります
                } 
            } 
            もし(直前に入って>ヴァル== 
                最後= NULL; 
            最初 - > =次の最後。
        } 
    } 
    戻り P-> 次。
} 
}。

同じことを考えて、再帰:2を書きます

* DeleteDuplication ListNode(ListNode * PHEAD)
{ 
    IF(PHEAD == NULL || pHead->次に== NULL)// 唯一のノード0またはノード
        戻りPHEAD;
     IF(pHead->ヴァル== pHead- >ネクスト>ヴァル)// 現在のノードが重複ノードである
    { 
        ListNode * TEMP = pHead-> 次に、
         一方!(TEMP = NULL && temp->ヴァルpHead- ==>ヴァル)// 現在のノードと同じスキップすべてのノードは、第一の電流接合ノード異なる見つけるために 
            TEMP = temp-を> 次に、
         戻り deleteDuplication(TEMP)を; // 再帰最初のノード異なるノードからの電流で始まり 
    } // 現在のノードが重複ノードではない
    { 
        PHEAD- >次に= deleteDuplication(pHead->次に); // 現在のノードを維持し、再帰は、次のノードから始まり
        戻りPHEAD; 
    } 
}

おすすめ

転載: www.cnblogs.com/yinbiao/p/11589241.html