61. Rotate List

package LeetCode_61

/**
 * 61. Rotate List
 * * https://leetcode.com/problems/rotate-list/
 *
 * Given a linked list, rotate the list to the right by k places, where k is non-negative.
 *
Example 1:
Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL

Example 2:
Input: 0->1->2->NULL, k = 4
Output: 2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right: 0->1->2->NULL
rotate 4 steps to the right: 2->0->1->NULL
 * */
class ListNode(var `val`: Int) {
    var next: ListNode? = null
}

class Solution {
    /*
    * solution, step:
    * 1. count the length of ListNode and find out tail
    * 2. find out new-head's prev node and set this prev node.next = null
    * 3. set tail.next = head
    * Time complexity:O(n), Space complexity:O(1)
    * */
    fun rotateRight(head: ListNode?, k: Int): ListNode? {
        if (head == null) {
            return null
        }
        //if not null, mean length at least 1
        var length = 1
        var tail = head
        //avoid set tail to null
        while (tail!!.next != null) {
            length++
            tail = tail.next
        }
        //rotate k time == rotate k % length time, avoid k larger than length
        val k_ = k % length
        if (k_ == 0) {
            //after k step, the same with the old head
            return head
        }
        /*
        * find out newHead's prev node, for example: 1->2->3->4->5, k=2, need change into: 4->5->1->2->3
        * newHead should be 4,it's prev node is 3, and 3 is the tail of newHead, so set 3.next = null
        * */
        var prevOfNewHead = head
        for (i in 0 until length - k_ - 1) {
            prevOfNewHead = prevOfNewHead!!.next
        }
        //create new head
        val newHead = prevOfNewHead!!.next
        prevOfNewHead.next = null
        //set 5.next = old head
        tail!!.next = head
        return newHead
    }
}

 

posted @ 2020-10-30 15:11  johnny_zhao  阅读(88)  评论(0编辑  收藏  举报