Efficient list rotation

Richard A. O'Keefe ok@REDACTED
Mon Apr 18 04:06:56 CEST 2005

Let's consider the problem abstractly first.

We are given
    X - an element to look for
    L - a list to look for X in

Suppose we can decompose
    L = A ++ [X] ++ Z
where A is as short as possible.
Then to rotate L so that X is at the end is
to return Z ++ A ++ [X]

If we cannot decompose L that way, X does not
occur, and following usual Erlang practice,
"just let it crash".

    rotate_to_end(L, X) ->
	rotate_to_end_aux(L, X, []).

    rotate_to_end_aux([X|Z], X, ReversedA) ->
	Z ++ reverse_append(ReversedA, [X]);
    rotate_to_end_aux([H|T], X, ReversedA) ->
	rotate_to_end_aux(T, X, [H|ReversedA]).

    reverse_append([], R) -> R;
    reverse_append([H|T], R) ->
	reverse_append(T, [H|R]).

This code has been tested.  It builds length(L)+length(A) cons
cells, of which length(L) are retained.

More information about the erlang-questions mailing list