Делать это с итераторами - странный способ, так как метод Collections.swap
(который, вероятно, самый простой способ получить то, что вам нужно) специально запрашивает индексы. Так что, прежде всего, используйте их. Тем не менее, вы также можете сделать это с помощью итераторов. Это может выглядеть следующим образом:
public static <T> List<T> reverse(List<T> input)
{
ListIterator<T> it = input.listIterator();
ListIterator<T> itR = input.listIterator(input.size());
while (it.nextIndex() - itR.previousIndex() < 0)
{
Collections.swap(input, it.nextIndex(), itR.previousIndex());
it.next();
itR.previous();
}
return input;
}
Вы начинаете с настройки итераторов. Один начинается в начале списка, другой в конце.
Тогда вы зацикливаетесь до тех пор, пока it.nextIndex() - itR.previousIndex() < 0
. Это в основном перемещает оба итератора в центр списка без их пересечения, поэтому вы не можете поменять местами уже переставленные элементы.
Наконец, вы просто меняете элементы по соответствующим индексам и перемещаете итераторы.
Обновление
Поскольку вы указали, что вы не можете напрямую использовать Collections.swap
(по любой причине), вы, очевидно, также можете заново изобрести колесо и просто переписать, что делает метод.
public static <T> List<T> reverse(List<T> input)
{
ListIterator<T> it = input.listIterator();
ListIterator<T> itR = input.listIterator(input.size());
while (it.nextIndex() - itR.previousIndex() < 0)
{
T temp = input.get(it.nextIndex());
input.set(it.nextIndex(), input.get(itR.previousIndex()));
input.set(itR.previousIndex(), temp);
it.next();
itR.previous();
}
return input;
}
Точно так же, без использования (честно во всех случаях предпочтительного) метода Collections.swap
.