leetcode第1ブラシ_Rotate List


私は何度も提出して、間違いはわけがわからなくて、それからやっと分かってきて、もとは私は問題を理解し間違えました.
この問題の意味は、最後のkつの位置の要素を前に移動させるということではありません.この問題のやり方は、2つのポインタで、まず1つを歩かせ、一定の長さに歩いた後、2つを一緒に歩くことです.簡単です.実際にはチェーンテーブル全体が右に移動することを意味し、1つのチェーンテーブルの長さがNであると仮定すると、右にN回移動すると、チェーンテーブルは元の姿に戻ります.kの取値範囲は非負、すなわちNより大きくてもよいので、実際のシフト回数は(k%N)にすぎない.
コードはあまり言わないで、簡単です.
class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(!head||!head->next||k==0)
            return head;
        int i=0, len=0;
        ListNode *pre=head, *pNode = head, *newHead;
        while(pNode){
            len++;
            pNode = pNode->next;
        }
        pNode = head;
        k %= len;
        if(k == 0)  return head;
        while(inext;
            i++;
        }
        while(pNode->next){
            pre = pre->next;
            pNode = pNode->next;
        }
        newHead = pre->next;
        pre->next = NULL;
        pNode->next = head;
        return newHead;
    }
};