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

    }

};


 

 

 

 

你可能感兴趣的:(LeetCode)