Ocaml - 将列表的最后一个元素移到前面

Row*_*awn 4 recursion ocaml linked-list list

首先,我道歉,如果这是一个混乱或倒退的方式来实现我想要完成的事情,但我是"Ocaml风格"的新手.

我想获取列表的最后一个元素,并将其移动到列表的前面,将所有元素向上移动一个.

例如:有 [1;2;3;4;5] -> [5;1;2;3;4]

我知道Ocaml中的列表基本上是链表,所以我计划递归遍历列表,找到最后一个元素,然后让该元素的尾部/剩余列表指向列表的头部.

我主要关注的是如何打破从倒数第二个元素到最后一个元素的链接.在上面的例子中,我希望得到5指向1,但4指向不再指向5.

我如何实现这一点,是否有一种更简单的方式来看待我完全失踪?

Jos*_*ith 7

你不能"破解链接",因为Ocaml列表是一个持久的数据结构.您无法真正修改列表,因此您必须按所需顺序生成包含值的新列表.

let thelist = [1;2;3;4;5] in
let lnewhead = List.hd (List.rev thelist) in
lnewhead :: (List.rev (List.tl (List.rev b)));;
Run Code Online (Sandbox Code Playgroud)

您还可以在函数中定义它:

let flipper = fun thelist -> 
    (List.hd (List.rev thelist)) :: (List.rev (List.tl (List.rev thelist)));;

val flipper : 'a list -> 'a list = <fun>
# flipper([1;2;3;4;5]);;
- : int list = [5; 1; 2; 3; 4]
Run Code Online (Sandbox Code Playgroud)