Quote Originariamente inviata da VinSmoke Visualizza il messaggio
se chiede "a partire da un ArrayList...", dovrei immaginare di scrivere:

static ArrayList<?> reverse( ArrayList<?> listIn ){
Ehm, no. Questo intanto non è un metodo "generico". Hai solo usato dei unbounded wildcard. Che però ti creeranno solo "grane". Grane sia a livello di implementazione (un elemento lo puoi estrarre solo come Object e non puoi inserire nulla in un ArrayList<?> .. a parte un null letterale) e grane nell'uso finale (se gli passi un ArrayList<String> ok ma poi NON puoi assegnare il valore restituito ad una variabile ArrayList<String>).

Meglio un metodo veramente "generico":

public static <T> ArrayList<T> reverse(ArrayList<T> input)

Quote Originariamente inviata da VinSmoke Visualizza il messaggio
Tuttavia mentre scrivo e riscrivo codice sento la necessità di utilizzare anche un indice (per scandire gli elementi)
Non devi usare alcun indice né "scandire" la lista ... altrimenti stai facendo qualcosa di iterativo, non ricorsivo.

Il concetto è semplice: ricevi una lista, ne fai innanzitutto una copia (vedi costruttore di ArrayList) perché l'input non lo devi toccare (vale per la prima chiamata ma vale allora anche per quelle ricorsive), poi estrai (nel senso di ottenere ma anche proprio togliere) il primo elemento. Quindi chiami ricorsivamente con la lista che rimane. Alla fine aggiungi al fondo l'elemento tolto dall'inizio.
Ogni chiamata ricorsiva farà così. Chiaramente devi studiare la condizione per non procedere nella ricorsione ad un certo punto.

Per altri dubbi, chiedi.