没有内置的列表机制可以做到这一点。但是,您可以使用包含您访问过或未访问过的元素的元组来构建一个。
基本结构是一个包含两个列表的元组:{Old, New}
。当你第一次从一个空列表开始时,它看起来像{[],[]}
。当您填写列表时,您将其填写在New
list:
new() -> {[], []}.
insert(X, {Old, New}) -> {Old, [X|New]}.
peek({_Old, [H|_]}) -> X.
要在列表中移动,您首先要做的是在New
列表,并将值放入旧列表中:
next({Old, [H|New]}) -> {[H|Old], New}.
这很好,就像我们只是丢弃旧元素一样。当我们到达列表末尾时会发生什么?我们需要修复这个函数(还有 peek 函数):
peek({Old, []}) -> hd(lists:reverse(Old));
peek({_Old, [H|_]}) -> X.
next({Old, []}) ->
{[], lists:reverse(Old)}}.
next({Old, [H|New]}) ->
{[H|Old], New}}.
如果列表中没有任何内容,它就会崩溃。如果您想通过特殊大小写,也可以返回“未定义”:
next({[], []}) ->
undefined;
next({Old, []}) ->
{[], lists:reverse(Old)}.
next({Old, [H|New]}) ->
{[H|Old], New}.
然后,您可以使用“下一步”、“查看”功能以及可能的“删除”功能(见下文)来执行正常操作。我们还可以添加一个“prev”函数以允许向后浏览:
prev({[], []}) ->
undefined;
prev({[], New}) ->
{lists:reverse(New), Old}.
prev({[H|Old], New}) ->
{Old, [H|New]}.
delete({Old, []}) -> {[], tl(lists:reverse(Old))};
delete({Old,[H|New]}) -> {Old, New};
这应该涵盖了大部分内容。