Есть два очевидных способа структурировать связанный список в Mathematica: «слева»:
{1, {2, {3, {4, {5, {6, {7, {}}}}}}}}
и «справа»:
{{{{{{{{}, 7}, 6}, 5}, 4}, 3}, 2}, 1}
Это можно сделать с помощью:
toLeftLL = Fold[{#2, #} &, {}, Reverse@#] & ;
toRightLL = Fold[List, {}, Reverse@#] & ;
Если я воспользуюсь ими и сделаю простой ReplaceRepeated
для просмотра связанного списка, я получу совершенно разные результаты Timing
:
r = Range[15000];
left = toLeftLL@r;
right = toRightLL@r;
Timing[i = 0; left //. {head_, tail_} :> (i++; tail); i]
Timing[i = 0; right //. {tail_, head_} :> (i++; tail); i]
(* Out[6]= {0.016, 15000} *)
(* Out[7]= {5.437, 15000} *)
Почему?