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
        }
    }
  • 相关阅读:
    Linux常用命令及示例(全)
    linux下安装配置svn服务器
    Kafka、Redis和其它消息组件比较
    ORACLE定时备份方案
    mysql库表优化实例
    携程apollp快速部署DVE集群
    windows 安装Zookeeper 配置集群
    Ubuntu 18.04 LTS 修改Host,使用Host访问
    PowerShell因为在此系统中禁止执行脚本......
    常用第三方工具的Docker命令
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13902247.html
Copyright © 2011-2022 走看看