leetcode: rotate-list:旋轉鏈表

題目描述:

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

For example:
Given1->2->3->4->5->NULLand k =2,
return4->5->1->2->3->NULL.

題目解析:

題目的意思是:給定一個鏈表,將鏈表旋轉到右邊的k個位置,k是非負的。

思路:1.首先遍歷一遍鏈表,求出鏈表的長度。

2.重置一下k:當k大於鏈表長度的時候,讓k%鏈表長度,此時k是一個小於len的數。倒數第k個元素,就是正數的(len-k+1)個元素,從頭結點走到該元素,需要走len-k步。

3.將鏈表的首尾相連一下,尾節點指向頭結點。從尾節點開始走len-k步,就到了倒數第k個元素的前一個節點。新鏈表的頭結點就是倒數第k個節點,並將倒數第k個節點的前一個節點置空。

AC代碼:

/**
 * 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) {
        if(head == NULL || k == 0)
            return head;
        ListNode* cur = head;
        int len = 1;
        while(cur->next)
        {
            len++;
            cur = cur->next;
        }
        //此時cur指向最後一個節點
        k = len - (k % len);
        //首尾相連一下
        cur->next = head;
        for(int i = 0;i < k;++i)
        {
            cur = cur->next;
        }
        //新的頭結點:
        head = cur->next;
        //cur指向此刻的尾,置空一下
        cur->next = NULL;
        return head;
    }
};

(*^▽^*)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章