LeetCode 61. Rotate List in F#
URL
leetcode.com/problems/rotate-list
Code
github.com/syohex/dotnet-study/blob/master/..
type LinkedList =
| ListEnd
| ListNode of int * LinkedList
static member length(lst: LinkedList) : int =
let rec length' lst acc =
match lst with
| ListEnd -> acc
| ListNode (_, rest) -> length' rest (acc + 1)
length' lst 0
static member take (n: int) (lst: LinkedList) : LinkedList =
if n = 0 then
ListEnd
else
match lst with
| ListEnd -> failwith "list is too short"
| ListNode (v, rest) -> ListNode(v, LinkedList.take (n - 1) rest)
static member skip (n: int) (lst: LinkedList) : LinkedList =
if n = 0 then
lst
else
match lst with
| ListEnd -> failwith "list is too short"
| ListNode (_, rest) -> LinkedList.skip (n - 1) rest
static member concat (lst1: LinkedList) (lst2: LinkedList) : LinkedList =
match lst1 with
| ListEnd -> lst2
| ListNode (v1, rest1) -> ListNode(v1, LinkedList.concat rest1 lst2)
static member toList(lst: LinkedList) : int list =
match lst with
| ListEnd -> []
| ListNode (v, rest) -> v :: (LinkedList.toList rest)
let rotateRight (lst: LinkedList) (k: int) : LinkedList =
let len = lst |> LinkedList.length
if len = 0 then
lst
else
let k = k % len
let lst1 = lst |> LinkedList.skip (len - k)
let lst2 = lst |> LinkedList.take (len - k)
LinkedList.concat lst1 lst2