Jak odwrócić elementy w liście dwustronnej dwukierunkowej z głową w czasie stałym?
0
0
Niedasie.
Ew. możesz sobie zwrócić widok, który iteruje od końca.
0
Przy odpowiednich założeniach da się. Np jeśli ustalimy że każdy węzeł listy ma dwa wskaźniki, ale nie jest na stałe określone w którą stronę prowadzą. Jeśli kierunek jest ustalany na podstawie wcześniej odwiedzonego węzła, to następnik to ten który nie jest poprzednikiem :]
0
Da się i nawet na DevCrowd o tym z kimś gadałem w kuluarach. Co prawda trzeba się nakombinować, ale tylko trochę. Istota kodu:
class Entry<T>{
final T value;
Entry<T> neighbor1;
Entry<T> neighbor2;
Entry(T value){
this.value = value;
}
//... logika dodawania sąsiadów
// i magia
Entry<T> next(boolean direction){
return direction?neighbor1:neighbor2;
}
}
Problemy, które mogą się wydarzyć:
- synchronizacja
- zmiana kierunku gdy działa iterator, a ten powinien dostać tak naprawdę:
public Iterator<T> iterator(){
return new InternalIteratorImpl(this.first(), direction);
}
gdzie first
zwraca pierwszy element w liście, a direction
jest sterowane np. za pomocą metody reverse
.
W liście siedzi aktualny kierunek. Do iteratora podajemy "migawkę" kierunku.