/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* rotateLinkedList(ListNode* head, int k) {
        // write code here
        // 算出节点数量
        ListNode* temp = head;
        int len = 0;
        while(temp)
        {
            temp = temp->next;
            ++len;
        }

        k %= len;
        if(k==0 || head==nullptr)
            return head;

        // 新链表头的前一个
        ListNode* t_1 = head;
        // 新链表头
        ListNode* t_2 = head;
        // 原来链表的最后一位
        ListNode* t_3 = head;
        // 从下标 1 开始
        int t = 1;
        while(t<len)
        {
            // 新链表头的前一个
            if(t<len-k)
                t_1 = t_1->next;
            // 新链表头
            if(t<=len-k)
                t_2 = t_2->next;
            // 原来链表的最后一位
            t_3 = t_3->next;
            ++t;
        }

        // cout << t_1->val << ", " << t_2->val << ", " << t_3->val << endl;

        t_1->next = nullptr;
        t_3->next = head;
        
        return t_2;
    }
};