您可以通过常规链表递归并解构当前头和下一个头。要查找的特殊情况就在基本情况之前(即没有“下一个id”或类似id的项目)。
例如,如果我们有一个地图列表,比如:
my_list = [
%{id: 1, next: nil, previous: nil},
%{id: 2, next: nil, previous: nil},
...
]
def doubly_link([]), do: []
def doubly_link([head | []]) do
head = %{head | next: nil}
[head | doubly_link([])]
end
def doubly_link([head | [next_head | tail]]) do
head = %{head | next: next_head.id}
next_head = %{next_head | previous: head.id}
[head | doubly_link([next_head | tail])]
end
然后打电话
doubly_link(my_list)
会产生:
[
%{id: 1, previous: nil, next: 2},
%{id: 2, previous: 1, next: 3},
....,
%{id: n, previous: prior_to_n_id, next: nil}
]