• 【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;
        }
    };


  • 相关阅读:
    AlertDialog弹出退出对话框和图片对话框
    android 真机配置
    Intent传递对象的两种方法(Serializable,Parcelable)
    COM入门简介
    WinRT简介
    什么是Windows服务
    C++更改控制台输出颜色
    在线编译器
    软件制作:QQGamePlug Lianliankan Plug
    网络安全:WinRAR命令行压缩
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3020129.html
Copyright © 2020-2023  润新知