タイトル説明
ソートされたリンクリストのノードが重複して、重複したノードのリストを削除し、ノードが繰り返さ保持していない、ヘッド・ポインタ・リストを返します。例えば、リスト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; } }