Erro no código Java: Erro java.lang.IndexOutOfBoundsException ao tentar inverter uma lista Integer através de um "for inverso"

Método onde deu erro:

private List<Integer> inverter(List<Integer> inversao) {
		List<Integer> aux = inversao;
		
		//inverte através de um for decrescente
		for(int i = inversao.size(); i >= 0; i--) {
			aux.add(inversao.get(i));//erro aqui
		}
		
		return aux;
	}

Código completo:

package entidades;

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

public class Escher {

	private List<Integer> lista = new ArrayList<>();
	
	//------------------------

	public List<Integer> getLista() {
		return lista;
	}
	
	public void add(Integer n) {
		lista.add(n);
	}

	//------------------------
	
	private List<Integer> inverter(List<Integer> inversao) {
		List<Integer> aux = inversao;
		
		//inverte através de um for decrescente
		for(int i = inversao.size(); i >= 0; i--) {
			aux.add(inversao.get(i));//erro aqui
		}
		
		return aux;
	}
	
	public char verificador() {
		char resultado = 'N';
		
		int aux = 0;
		
		List<Integer> invertido = inverter(lista);//lista invertida
		List<Integer> soma = new ArrayList<>();
		
		for(int i = 0; i < invertido.size(); i++) {
			soma.add(invertido.get(i) + lista.get(i));//lista "soma" recebendo os valores da lista normal somado com a sua inversão
			
			//para cada elemento diferente, será incrementado + 1 em aux
			if(soma.get(0) != soma.get(i)) {
				aux++;
			}
			
		}
		
		//caso a variável valer 0, a variável resultado irá receber um 'S'
		if(aux == 0) {
			resultado = 'S';
		}
		
		
		return resultado;
	}
	
	
}


package principal;

import java.util.Scanner;

import entidades.Escher;

public class Programa {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		Escher escher = new Escher();
		
		int n = scan.nextInt();
		
		for(int i = 0; i < n; i++) {
			int lista = scan.nextInt();
			escher.add(lista);
		}
		
		System.out.println(escher.verificador());
		
		scan.close();

	}

}
//https://olimpiada.ic.unicamp.br/pratique/pj/2020/f1/escher/

Descrição do erro:

Exception in thread “main” java.lang.IndexOutOfBoundsException: Index 5 out of bounds for length 5
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
at java.base/java.util.Objects.checkIndex(Objects.java:359)
at java.base/java.util.ArrayList.get(ArrayList.java:427)
at entidades.Escher.inverter(Escher.java:27)
at entidades.Escher.verificador(Escher.java:38)
at principal.Programa.main(Programa.java:21)

Listas são indexadas em zero (o primeiro elemento está no índice zero, o segundo no índice 1, etc).

Vamos supor que a lista tem 4 elementos: os índices serão 0, 1, 2, e 3. O size() dela é 4, mas o último elemento está no índice 3. Se tentar acessar a posição 4 dará erro, e é isso que aconteceu aí, você acessou um índice que não existe.

De forma geral, o último elemento sempre está na posição size() - 1. Outro detalhe é que você faz com que a lista aux receba a lista original, e depois vai adicionando elementos nela. Mas isso está errado. Se quer inverter os elementos, tem que criar uma lista nova:

private static List<Integer> inverter(List<Integer> inversao) {
    List<Integer> aux = new ArrayList(); // crie uma lista nova

    // comece em size() - 1
    for (int i = inversao.size() - 1; i >= 0; i--) {
        aux.add(inversao.get(i));
    }

    return aux;
}

Puuuutz mano! Verdade! Erro simples, que vacilo. Muito obrigado.