zoukankan      html  css  js  c++  java
  • 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
        }
    }
  • 相关阅读:
    Mysql知识总结
    Unity3D UGUI 自动调节大小
    关于 Rijndael 加密
    配置java环境
    二叉查找树
    序列化和反序列化
    关于文件保存/关闭时报错:文件正由另一进程使用,因此该进程无法访问此文件。
    关于Unity中NGUI图片精灵响应鼠标的方法
    用人类的话来描述 里氏转换
    C#中string的相关方法
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13902247.html
Copyright © 2011-2022 走看看