Problemas Lista dentro de Lista

To tentando fazer um código aqui que resolve esse problema:

a metade esquerda de cada linha está sendo impressa a partir do meio da página até a margem esquerda. Do mesmo modo, a metade direita de cada linha está sendo impressa à partir da margem direita e prosseguindo em direção ao centro da página.

Por exemplo a linha:
THIS LINE IS GIBBERISH

está sendo impressa como:
I ENIL SIHTHSIREBBIG S

Tentei fazer desse jeito aqui mas fica dando erro pra ler na parte em negrito:
Alguém consegue me ajudar?

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class DeDentroPraFora {

public static void main(String[] args) {
	
	Scanner teclado = new Scanner(System.in);
	
	System.out.println("Quantidade de casos teste?");
	int n = teclado.nextInt();
	List<List<Character>> frases = new ArrayList<List<Character>>();
	int i = 0;
	while(i<n) {
		teclado.nextLine();
		System.out.println("\nCaso " + (i+1));
		System.out.println("\nDigite a frase: ");
		
		String frase = teclado.nextLine();
		
		while(frase.length()<2 || frase.length()>100) {
			System.out.println("Frase inválida! Digite Novamente!");
			frase = teclado.nextLine();
		}
		
		List<Character> letras = new ArrayList<Character>();
		for(int j = 0; j < frase.length();j++) {
			letras.add(frase.charAt(j));
		}
		frases.add(letras);
		i++;
	}
	
	**for(List<Character> lista : frases)** { // Organizando a lista com as palavras
		int b = 0;
		List<Character> letras = new ArrayList<Character>();
		for(int z = ((lista.size()/2)-1); z >= 0;z--) {
			letras.add(lista.get(z));
		}
		for(int z = (lista.size()-1); z >= lista.size()/2;z--) {
			letras.add(lista.get(z));
		}
		frases.add(b, letras); // substituindo as erradas pela certa na lista
		b++;
	}
	
	for(List<Character> lista : frases) {
		for(Character letra : lista) {
			System.out.print(letra);
		}
		System.out.println();
	}
	
	teclado.close();
}

}

O erro acontece porque a lista frases está sendo modificada ao mesmo tempo que é iterada.
Para corrigir, vc pode trocar o loop e o add por set:

int qtdDeFrases = frases.size();
for (int i = 0; i < qtdDeFrases; i++) {
  List<Character> letras = frases.get(i);

/* ..... */

// frases.add(b, letras); // substituindo as erradas pela certa na lista
frases.set(b, letras); // substituindo as erradas pela certa na lista

ou criar uma nova lista e adicionar as letras:

// frases.add(b, letras); // substituindo as erradas pela certa na lista
frasesCorrigidas.add(letras);
1 curtida