Skip to main content

How do I reverse a list

In this Q&A, we'll go over a few options to reverse a list.

How to reverse and create a new list


There are two options to reverse a list
- using iterators.  See function reverseWitItereator
- using stream.  See function reverseWithStream

How to reverse a list in place

If you want to reverse a list in place use Collections.reverse.  See function reverseInPlace

How to create a reverse list view

If you want to create a reverse view use Guava Lists.reverse.  Reverse view ensures that changes to the original list are reflected in the new list in reverse order.


import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
import java.util.stream.Collectors;
import static org.junit.Assert.*;

public class Reverse {
    public static List<Integer> reverseWitItereator(List<Integer> l) {
        List<Integer> l2 = new ArrayList<>();
        ListIterator<Integer> rev = l.listIterator(l.size());
        while(rev.hasPrevious()) {
            l2.add(rev.previous());
        }
        return l2;
    }

    public static List<Integer> reverseWithStream(List<Integer> l) {

        return l.stream().map((i) -> l.size()-1-i ).collect(Collectors.toList());
    }

    public static void reverseInPlace(List<Integer> l) {

        Collections.reverse(l);
    }

    public static List<Integer> reverView(List<Integer> l) {

        return Lists.reverse(l);
    }

    public static void main( String[] args ) {

        List<Integer> l1 = new ArrayList<>();
        for(int i=0; i < 100; ++i) {
            l1.add(i);
        }
        List<Integer> l2 = reverseWitItereator(l1);
        l2 = reverseWithStream(l1);
        System.out.println("end");

        l2 = reverView(l1);

        l1.add(101);
        assertEquals("reverse check", l2.get(0).longValue(), 101);
    }
}

Comments