リンクされたリストで円を見つけて、円の先頭にあるノードを返そうとしています。たとえば、リストが A -> B -> C -> D -> C の場合 -- C を返します。
これが私のコードです:
ListNode<T> * findCircle()
{
map<ListNode<T>*, bool> addresses;
ListNode<T>* node = head;
if(addresses.find(node)->second)
cout << " wtf " << endl;
while(node)
{
if((addresses.find(node))->second)
{
return node;
}
else
addresses.insert(pair<ListNode<T>*,bool>(node, 1));
node = node->next;
}
return NULL;
}
いくつかの質問を聞きたいんです:
1)これは問題にアプローチする正しい方法ですか
2) キーと値をテーブルに検索/挿入する最も効率的な方法を使用していますか?
3) なぜ機能しないのですか? head を挿入する前に、head のマップをチェックインすると、if ステートメントが実行され、"wtf" が出力されます。私のアルゴリズムは、ノードがマップに見つからない場合は真の値を持つキーとしてノードを挿入し、それ以外の場合はキーが既にマップにある場合はノードを返します。
std::set でこれをやってみましたが、うまくいかなかったので、マップに切り替えました。私を困惑させているのは、まったく同じ方法論を使用して、次のコード (リンクされたリスト内の重複を削除するコード、ルックアップ テーブルを使用) が機能することです。
void removeDuplicates()
{
map<T, bool> listData;
ListNode<T> *node;
ListNode<T> *prev = node;
for(node = head; node; node = node->next)
{
if(listData.find(node->data)->second)
{
prev->next = node->next;
delete node;
}
else
{
listData.insert( pair<T, bool>(node->data, 1));
}
prev = node;
}
}
コードの 2 番目のブロックが想定どおりに機能するのに、最初のブロックが機能しないのは単なるまぐれですか?