Предположим, вы хотите найти средний node связанного списка как можно эффективнее. Самый типичный "лучший" ответ - поддерживать 2 указателя, средний и текущий. И чтобы увеличить средний указатель, когда количество встречающихся элементов делится на 2. Следовательно, мы можем найти середину за 1 проход. Эффективный, не так ли? Лучше, чем грубая сила, которая включает в себя 1 проход до конца, затем еще 1 проход, пока мы не достигнем размера /2.
НО... не так быстро, почему первый метод быстрее, чем метод "грубой силы"? В первом методе мы увеличиваем средний указатель примерно на размер /2 раза. Но в режиме грубой силы, на нашем втором пропуске, мы переходим к списку, пока не достигнем размера/2-го node. Разве эти два метода не одинаковы? Почему первое лучше второго?
//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();
}