2017-10-18 3 views
0
class LN { 
    public: 
    LN()      : next(nullptr){} 
    LN (const LN<T>& ln)   : value(ln.value), next(ln.next){} 
    LN (T v, LN<T>* n = nullptr) : value(v), next(n){} 
    T  value; 
    LN<T>* next; 
}; 

void remove(LN<T>*& l) { 
    if (l == nullptr) 
     return; 
    for (LN<T>* p = l; p->next != nullptr; p = p->next) 
    { 
     if (p -> value == p -> next -> value) 
     { 
      LN<T>* to_delete = p; 
      p = p -> next; 
      delete to_delete; 

      LN<T>* to_delete2 = p; 
      p = p->next; 
      delete to_delete2; 
      break; 
     } 
    } 
} 

リンクリストの重複するペアを削除する関数を作成しようとしています。例えばforループで2回削除した後に変数を使用できません(リンクリスト)

1 - > 1 - > 2 - > 3 - > nullptr 2であるべきである - (これらは重複している場合、値の両方を除去する)Iが通過した

関数を呼び出した後> nullptr - > 3行ごとにデバッグして、何が間違っているかを見つけることができませんでした。デバッグでは、 "変数が利用できません"と表示されました。

私はそれを解決する手助けをすることはできますか?どうもありがとう。

+0

'next'が' to_delete'を指しているノードがあり、今はランダムなゴミを指しています。あるいは、削除されている2つのノードがリストの先頭にある場合、 'l'はランダムなゴミを指すようになります。 –

+0

テストケースには、リストの先頭に2つのノードが同じであることが含まれています。どのようにそれを修正するための任意の提案? – 12345

答えて

0

removeの方法では、最初の2つのノードの値が同じかどうかを確認する必要があります。そのようなものかもしれません

template <typename T> 
void remove(LN<T>*& head) 
{ 
    LN<T>* tmp1, *tmp2, *duplicate; 
    tmp1 = head; 
    while (tmp1 != nullptr && tmp1->next != nullptr) 
    { 
     tmp2 = tmp1; 
     while (tmp2->next != NULL) 
     { 
      if (tmp1->value == tmp2->next->value) 
      { 
       duplicate = tmp2->next; 
       tmp2->next = tmp2->next->next; 
       delete(duplicate); 
      } 
      else 
       tmp2 = tmp2->next; 
     } 
     tmp1 = tmp1->next; 
    } 
} 
+0

こんにちは、最初の2つの値が同じ場合にのみ修正プログラムが動作します。しかし、重複が中央にある場合は機能しません。 – 12345

+0

Srが悪いのですが、更新されたコードのブロックを試してください。 –

+0

更新のおかげで感謝しますが、まだ問題はあります。あなたのコードは、重複した値だけを削除します。重複した値と元の値の両方を削除する必要があります。 1 - > 1 - > 2 - > 3 - > nullptrは2 - > 3 - > nullptr(どちらも1が削除されます) – 12345

関連する問題