リンクされたリストの中間ノードを可能な限り効率的な方法で見つけたいとします。与えられた最も典型的な「最良の」答えは、中間と現在の 2 つのポインターを維持することです。そして、遭遇した要素の数が 2 で割り切れる場合に中間ポインタをインクリメントします。したがって、1 回のパスで中間を見つけることができます。効率的ですよね?最後まで 1 回パスしてから、サイズ/2 に達するまでさらに 1 回パスするブルート フォースよりも優れています。
しかし...それほど速くはありません.最初の方法が「ブルートフォース」方法よりも速いのはなぜですか? 最初の方法では、中間ポインターを約 size/2 倍にインクリメントしています。しかし、強引な方法で、2 番目のパスでは、サイズ/2 番目のノードに到達するまでリストをトラバースしています。これら2つの方法は同じではありませんか?1 番目が 2 番目よりも優れているのはなぜですか?
//finding middle element of LinkedList in single pass
LinkedList.Node current = head;
int length = 0;
LinkedList.Node middle = head;
while(current.next() != null){
length++;
if(length%2 ==0){
middle = middle.next();
}
current = current.next();
}
if(length%2 == 1){
middle = middle.next();
}