重複していないリンクリストの場合、次のコード(私の簡単なテストでは正しい)を持っていますが、少し醜いと思います。重複していないリンクリスト
重複したコードをよりきれいに処理する方法をお勧めしますか?
if((val == cur->val) || (cur->next && (val == cur->next->val)))
しかし、私はよりよい解決策は、比較演算子の異なる使用を使用して(私は見ていないこと)が存在するかもしれないと思う:問題の 現在の作品です。
また、誰かが私に「有用な」アサーションまたは内部の提案をしてもらえますか?アサートするタイミングを特定するのは難しいです。特にifステートメントがある場合は特にそうです。
struct Node
{
Node(int v):val(v),next(NULL){}
int val;
Node * next;
};
void insert(Node ** ppHead, const int val)
{
if(ppHead == NULL)
return;
if(*ppHead == NULL || val < (*ppHead)->val)
{
Node * tmp = new Node(val); // new throws
tmp->next = *ppHead;
*ppHead = tmp;
}
else
{
Node * cur = *ppHead;
while(cur->next && (val > cur->next->val))
cur = cur->next;
if((val == cur->val) || (cur->next && (val == cur->next->val)))
return;
Node * tmp = new Node(val); // new throws
tmp->next = cur->next;
cur->next = tmp;
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
Node * list = NULL;
int x[] = { 5, 4, 6, 7, 1, 8, 1, 8, 7, 2, 3, 0, 1, 0, 4, 9, 9 };
int size = sizeof(x)/sizeof(x[0]);
for(int i = 0; i < size; i++)
insert(&list, x[i]);
Node * cur = list;
while(cur) {
printf (" %d", cur->val);
cur = cur->next;
}
printf("\n");
return 0;
}
ジョブに間違ったデータ構造を使用している可能性があります。たとえば、ノードを特定の順序で格納する必要がありますか?そうでない場合は、ハッシュテーブルまたは平衡バイナリツリーを使用してコードを書き直すのは簡単です。 – Juliet
ジュリエットありがとうございますが、それはコーディングの際立った質問でした。 ;-)実際の問題ではありませんでした。 – teleball