Thanks for all the answers. I wrote a reverse2 method that works even for implementing the ArrayList and LinkedList classes. Not sure how effective it is.
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Arrays; // See http://stackoverflow.com/questions/16799066/return-reversed-generic-list-type-in-java. public class ReverseDemo { public static <T> List<T> reverse1(List<T> list) { List<T> reversed = new ArrayList<T>(); for (int i = list.size() - 1; i > -1; i--) { reversed.add(list.get(i)); } return reversed; } public static <T> List<T> reverse2(List<T> list) { int size = list.size(); ArrayList<T> obArray = new ArrayList<T>(); obArray.addAll(list); ListIterator<T> iter = list.listIterator(); for (int i = 0; i < size; i++) { iter.next(); iter.set(obArray.get(size - 1 - i)); } return list; } public static void main(String[] args) { LinkedList<Integer> linkedInt = new LinkedList<Integer>(); ArrayList<Double> arrayDouble = new ArrayList<Double>(); for (int k = 0; k < 10; k++) { double doubleNum = 10*Math.random(); int intNum = (int) (10*Math.random()); linkedInt.add(intNum); arrayDouble.add(doubleNum); } TextIO.putln("Testing reverse1."); // LinkedList<Integer> demo System.out.println(Arrays.toString(linkedInt.toArray())); System.out.println(Arrays.toString(reverse1(linkedInt).toArray())); TextIO.putln("LinkedList structure preserved?"); System.out.println(reverse1(linkedInt) instanceof LinkedList<?>); // ArrayList<Double> demo System.out.println(Arrays.toString(arrayDouble.toArray())); System.out.println(Arrays.toString(reverse1(arrayDouble).toArray())); TextIO.putln("ArrayList structure preserved?"); System.out.println(reverse1(arrayDouble) instanceof ArrayList<?>); TextIO.putln("\nTesting reverse2."); // LinkedList<Integer> demo System.out.println(Arrays.toString(linkedInt.toArray())); System.out.println(Arrays.toString(reverse2(linkedInt).toArray())); TextIO.putln("LinkedList structure preserved?"); System.out.println(reverse2(linkedInt) instanceof LinkedList<?>); // ArrayList<Double> demo System.out.println(Arrays.toString(arrayDouble.toArray())); System.out.println(Arrays.toString(reverse2(arrayDouble).toArray())); TextIO.putln("ArrayList structure preserved?"); System.out.println(reverse2(arrayDouble) instanceof ArrayList<?>); } }
console output:
Testing reverse1. [8, 0, 1, 9, 3, 4, 3, 7, 6, 3] [3, 6, 7, 3, 4, 3, 9, 1, 0, 8] Is the LinkedList structure saved? false [8.301783107294664, 5.434068303620735, 9.095396759542615, .41823972682620836, 9.56659902304762, 3.2560723280079085, 4.037362000077436, 9.731919590391389, 0.5243645318825874, 5.9432185528462975] [5.9432185528462975, 0.5243645318825874, 9.731919590391389, 4.037362000077436, 3.2560723280079085, 9.56659902304762, 0.41823972682620836, 9.095396759542615, 5.434068303620735, 8.301783107294664] Retained ArrayList structure ? true
Testing reverse2. [8, 0, 1, 9, 3, 4, 3, 7, 6, 3] [3, 6, 7, 3, 4, 3, 9, 1, 0, 8] Is the LinkedList structure saved? true [8.301783107294664, 5.434068303620735, 9.095396759542615, .41823972682620836, 9.56659902304762, 3.2560723280079085, 4.037362000077436, 9.731919590391389, 0.5243645318825874, 5.9432185528462975] [5.9432185528462975, 0.5243645318825874, 9.731919590391389, 4.037362000077436, 3.2560723280079085, 9.56659902304762, 0.41823972682620836, 9.095396759542615, 5.434068303620735, 8.301783107294664] Retained ArrayList structure ? true