package main

// ListNode ...
/* type ListNode struct {
	Val  int
	Next *ListNode
} */

/* func list2str(head *ListNode) string {
	curr := head
	str := make([]rune, 0)
	for curr != nil {
		str = append(str, rune(curr.Val+'0'))
		curr = curr.Next
	}
	return string(str)
} */

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func rotateRight(head *ListNode, k int) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}
	dummy := ListNode{0, head}
	curr := &dummy
	length := 0
	for curr.Next != nil {
		curr = curr.Next
		length++
	}
	k %= length
	if k == 0 {
		return dummy.Next
	}
	fast := &dummy
	curr = &dummy
	for i := 0; i < k; i++ {
		fast = fast.Next
	}
	for fast.Next != nil {
		fast = fast.Next
		curr = curr.Next
	}
	fast.Next = dummy.Next
	dummy.Next = curr.Next
	curr.Next = nil
	return dummy.Next
}

/* func main() {
	l16 := ListNode{6, nil}
	l15 := ListNode{5, &l16}
	l14 := ListNode{4, &l15}
	l13 := ListNode{3, &l14}
	l12 := ListNode{2, &l13}
	l1 := &ListNode{1, &l12}
	fmt.Println(list2str(l1))
	fmt.Println(list2str(rotateRight(l1, 0)))
	fmt.Println(list2str(rotateRight(l1, 1)))
	fmt.Println(list2str(rotateRight(&l16, 2)))
	fmt.Println(list2str(rotateRight(&l14, 3)))
	fmt.Println(list2str(rotateRight(l1, 4)))
	fmt.Println(list2str(rotateRight(&l13, 5)))
	fmt.Println(list2str(rotateRight(&l14, 6)))
	fmt.Println(list2str(rotateRight(&l14, 7)))
} */