LeetCode in Kotlin

61. Rotate List

Medium

Given the head of a linked list, rotate the list to the right by k places.

Example 1:

Input: head = [1,2,3,4,5], k = 2

Output: [4,5,1,2,3]

Example 2:

Input: head = [0,1,2], k = 4

Output: [2,0,1]

Constraints:

Solution

import com_github_leetcode.ListNode

/*
 * Example:
 * var li = ListNode(5)
 * var v = li.`val`
 * Definition for singly-linked list.
 * class ListNode(var `val`: Int) {
 *     var next: ListNode? = null
 * }
 */
class Solution {
    fun rotateRight(head: ListNode?, k: Int): ListNode? {
        if (head == null || k == 0) {
            return head
        }
        var tail = head
        // find the count and let tail points to last node
        var count = 1
        while (tail != null && tail.next != null) {
            count++
            tail = tail.next
        }
        // calculate number of times to rotate by count modulas
        val times = k % count
        if (times == 0) {
            return head
        }
        var temp = head
        // iterate and go to the K+1 th node from the end or count - K - 1 node from
        // start
        var i = 1
        while (i <= count - times - 1 && temp != null) {
            temp = temp.next
            i++
        }
        var newHead: ListNode? = null
        if (temp != null && tail != null) {
            newHead = temp.next
            temp.next = null
            tail.next = head
        }
        return newHead
    }
}