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

标签 list recursion linked-list ocaml

首先,如果这是我想要完成的事情的困惑或倒退的方式,我深表歉意,但我是“Ocaml 风格”的新手。

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

例如:有 [1;2;3;4;5] -> [5;1;2;3;4]
我知道 Ocaml 中的列表基本上是链表,所以我计划递归遍历列表,找到最后一个元素,然后让该元素的尾部/剩余列表指向列表的头部。

我主要困惑的是如何断开从倒数第二个元素到最后一个元素的链接。在上面的例子中,我想让 5 指向 1,但 4 不再指向 5。

我如何做到这一点,有没有一种更简单的方法来看待我完全缺失的这个问题?

最佳答案

你不能“断开链接”,因为 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)));;

您也可以在函数中定义它:
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]

关于list - Ocaml - 将列表的最后一个元素移到前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397785/

相关文章:

c - 递归搜索目录中的文件

c++ - 如何用链表替换 std::vector?

algorithm - 使用 3 个数组的双向链表

c - 尝试添加到 C 中链表的开头时出现无限循环

python - 如何将指定的键+值移动到另一个字典

python - 插入值时如何存储dict的差异?

java - 如何将集合拆分为子集合?

MySQL:可以递归锁定表吗?

python - 在不同的属性上调用 del 时,对象的列表属性会发生变化

c - 如何释放C中列表列表中的节点? (游戏)