質問: 単一のリンク リスト (つまり、次のノードへのポインターのみを持つリスト) があります。さらに、これは循環リンク リストです (この例では、最後のノードに最初のノードへのポインターがあります)。リスト内のすべてのノードには char が含まれています。
このようなリストの例: a->b->c->b->a
このリストがパリンドロームであるかどうかを確認するにはどうすればよいですか?
私は次の解決策を考えました:
リストの先頭から開始します。リストの長さを見つけてから、中間ノードを見つけます。リストの先頭から再び開始し、スタック内の要素を途中までプッシュし続けます。mid 要素と pop 要素からリストをトラバースします。ポップされた要素の値が現在のノードの値と等しい場合。そうでない場合は、false を返します。それ以外の場合は、スタックが空になり、すべての文字が確認されるまで続行します。短所:余分なスタックスペースを使用します:(
リストの先頭から開始します。リストの長さを見つけてから、中間ノードを見つけます。このリストの後半を逆にします。次に、2 つのポインター (1 つは start を指し、もう 1 つは mid+1 番目の要素を指す) を使用して、値が同じかどうかを確認します。そうでない場合は、false を返します。それ以外の場合は、開始ノードに再び到達するまで続行します。短所: 元のデータ構造を変更します。
この問題に取り組むためのよりエレガントな方法はありますか (O(n) 余分なスペースを使用したり、元のリストを変更したりしないことを願っています)? 特定の実装ではなく、アルゴリズムに興味があります。
ありがとう