Здесь:
out.writeObject(player.listIterator().next());
вы создаете новый итератор. Но у вас уже был итератор, и вам нужно использовать его, чтобы его состояние обновлялось.
out.writeObject(it.next());
В противном случае it.hasNext()
остается верным, потому что вы не берете элементы из it
.
В качестве альтернативы, избавьтесь от всех ссылок на итераторы, избавьтесь от while-l oop и просто используйте for-l oop:
for (List<String> item: player) {
out.writeObject(item);
}
for-l oop обрабатывает итератор неявно, поэтому вам не нужно.