template <class T>
bool SingleList<T>::Delsame(T x)
{
Node<T> *head;
if(NULL == head) return head;
Node<T> *p=head;
Node<T> *first=NULL;
while(NULL != p){
if(p->element == x){
Node<T> *del =p;
p=p->link;
if(NULL!= first){
first->link=p;
}else{
head=p;
}
delete del;
} else{
first=p;
p=p->link;
}
}
return head;
}
代码如上,如 1 2 3 2 4 5 2
需要删除所有的2,
希望得到的结果是1 3 4 5
但目前得到的是1 2 3 4 5,
以及存在无法删除只有一个的元素、连续相同元素无法删除的问题,
如何修改可以将所有相同元素都删去呢?
大家讲道理2017-04-17 15:31:02
よくわからない質問がいくつかありますので、よく確認してください。
head
が定義されていますが、値を代入せずにNULLチェックを行います。 head
には値が割り当てられていませんが、ランダムなアドレスなので NULL にはなりませんが、ここには明らかな論理エラーがあります
first
言葉の意味からすると最初のノードを表しますが、前のノードを表すために使用しました ここではlast
と改名した方がわかりやすいでしょうか?同様に、現在のポインター p
の名前を current
に変更することをお勧めします。
if 条件では、del
は後で使用するため、p を指すように p->next
を定義する必要はないようです。接続を変更した後は、delete p
だけを使用できます。 p = head
または p = first->next
を使用して現在のポインターを変更します。
Delsame
は bool
として定義されていますが、戻り値は head
その他のロジックでは今のところ問題は見つかっていませんので、まずは上記の問題を解析して対処してから効果を確認してみてはいかがでしょうか。
JavaScript は主にアルゴリズムのアイデアを提供するものであり、C/C++ を学習したことがある人は理解できるはずです。次に、このアイデアに基づいて C++ で実装する方法を考えることができます。
注:
JavaScript はオブジェクトを参照します。この参照は C++ ポインターに似ていますが、C++ 参照とは異なります。
JavaScript では delete が必要ないため、C++ プログラムに変更した後、適切な場所に delete を追加する必要があります。
私が C++ コードを書かない理由の 1 つは、頭を使わせるためであり、もう 1 つの理由は、環境を設定するのが面倒だからです
PHP中文网2017-04-17 15:31:02
リーリー
これは左側が閉じ、右側が開いている間隔であることに注意してください。つまり、[first, last) の範囲内のデータです。使用例: li.Remove(3)
ここで: beginと最後は次のとおりです:
リーリー