繁体   English   中英

创建双向链接列表的实例

[英]Creating instances of a doubly linked list

我得到了双向链表的以下实现:

type 'a elem = {v : 'a; mutable next : 'a lista; mutable prev : 'a lista}
and 'a lista = 'a elem option;;

使用此实现,我尝试列出一些示例。 一个元素列表很容易制作:

let bla_1 = Some {v = 1; next = None; prev = None};;

而且我猜一个空列表将是两个None节点。 但是我不知道如何制作包含更多元素的列表。

如果要构建包含两个元素xy的列表,则必须确保有两个相互指向的'a elem类型值(不计算中间选项类型'a lista )。 最终,您需要具有以下圆形结构:

  • lx绑定到{ v = x; next = Some ly; prev = None } { v = x; next = Some ly; prev = None } { v = x; next = Some ly; prev = None }
  • ly绑定到{ v = y; next = None; prev = Some lx} { v = y; next = None; prev = Some lx}

可以在OCaml中使用相互递归的值(感谢octhacron):

let rec x = { v = 0; next = Some y; prev = None} 
    and y = { v = 1; next = None; prev = Some x}

但这很难用于构建更复杂的列表。 这就是为什么您具有可变字段的原因:您可以构建节点,然后通过更改其nextprev字段来连接它们。 例如,您首先将next字段设置为None来定义lx ,并且只有在知道什么是ly ,才可以用Some ly替换lx.next指向的值。

以下是将常规列表转换为双向链接列表的函数; 当递归调用自身时,它将构建节点; 从递归调用返回时,它将修改next节点,以使其通过其prev字段指向当前节点:

let rec to_dbl_list = function
    [] -> None
  | x::xs ->
     let node = { v = x; prev = None ; next = (to_dbl_list xs)} in
     let current = Some node in
     (match node.next with
        None -> ()
      | Some next -> (next.prev <- current)) ;
     current ;;

所以:

# to_dbl_list [1; 2; 3];;
- : int lista =
Some
 {v = 1;
  next =
   Some
    {v = 2; next = Some {v = 3; next = None; prev = <cycle>}; prev = <cycle>};
  prev = None}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM