zoukankan      html  css  js  c++  java
  • 【leetcode】Rotate List

    Question:

    Given a list, rotate the list to the right by k places, where k is non-negative.

    For example:
    Given 1->2->3->4->5->NULL and k = 2,
    return 4->5->1->2->3->NULL.

    Anwser 1: merge a circle 

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *rotateRight(ListNode *head, int k) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            assert(k >= 0);
            
            if(head == NULL) return NULL;
            
            ListNode *ret = head;
            int len = 1;
            while(ret->next != NULL){
                len++;
                ret = ret->next;
            }
            
            ret->next = head;   // merge a circle list
            
            k = k % len;
            int step = len - k - 1;     // 1 is a head note
            ret = head;
            while(step > 0){
                ret = ret->next;
                step--;
            }
            
            head = ret->next;
            ret->next = NULL;
            
            return head;
        }
    };

    Anwser 2: left + right

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *rotateRight(ListNode *head, int k) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            assert(k >= 0);
            
            if(head == NULL) return NULL;
            
            ListNode *ret = head;
            int len = 1;
            while(ret->next != NULL){
                len++;
                ret = ret->next;
            }
            
            
            ListNode *tmp = head;
            
            k = k % len;
            int step = len - k - 1;     // 1 is a head note
            while(step > 0){
                tmp = tmp->next;        // left
                step--;
            }
            
            ListNode *tmp2 = tmp;       // right
            while(tmp2->next != NULL){
                tmp2 = tmp2->next;
            }
            
            tmp2->next = head;      // right->next
            
            ret = tmp->next;        // ret head
            tmp->next = NULL;       // left->next
            
            return ret;
        }
    };


  • 相关阅读:
    负载均衡之加权轮询算法(转)
    go 指南学习笔记
    select限制之文件描述符限制
    select的限制
    select实现超时(套接字IO超时设置)
    如何在CentOS 8上安装Puppet
    如何在Ubuntu 20.04 / 18.04或更老版本中安装ifconfig
    关于Ubuntu的Apt安装与使用介绍
    如何在CentOS 8上安装Suricata?
    如何在Ubuntu 20.04上安装PHP Composer
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3020129.html
Copyright © 2011-2022 走看看