Efficient list rotation

Vladimir Sekissov svg@REDACTED
Fri Apr 15 11:52:39 CEST 2005


Good day,

joelr1> -module(bar).
joelr1> -compile([export_all]).
joelr1> 
joelr1> rotate(_Target, []) ->
joelr1>     [];
joelr1> 
joelr1> rotate(Target, [H|T]) ->
joelr1>     rotate(Target, [H|T], none).
joelr1> 
joelr1> rotate(Target, [H|T], none) when Target =:= H ->
joelr1>     rotate(Target, T, H);
joelr1> 
joelr1> rotate(Target, [H|T], none) ->
joelr1>     rotate(Target, T ++ [H], none);
joelr1> 
joelr1> rotate(_Target, [], X) ->
joelr1>     [X];
joelr1> 
joelr1> rotate(_Target, [H|T], X) ->
joelr1>     [H|T] ++ [X].

rotate(Target, L) ->
    {Before, FromToEnd} =
          lists:splitwith(fun (E) -> E =/= Target end, L),
    case FromToEnd of
       [Target|T] ->
         T ++ lists:reverse([T|Before]);
       _ ->
         lists:reverse(L)
    end.

Best Regards,
Vladimir Sekissov



More information about the erlang-questions mailing list