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))) } */