/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ #include <list> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ ListNode* rotateLeft(ListNode* head, int k) { // write code here int len = 0; ListNode* temp = head; while(temp) { ++len; temp = temp->next; } // k 有可能比 len还大 k %= len; // 链表向右移动k位,则前len-k个链表放在后面,后面k个表面放在前面; int n = len-k; // 前后两个链表 // 第一段的头节点 ListNode* left = head; // 第二段的头节点 ListNode* right = head; // 保存两个链表的表头 ListNode* pre_left = left; ListNode* pre_right = nullptr; while(n>0) { // left 移到第一段的尾节点 if(n>1) left = left->next; // right一道第二段的头节点 right = right->next; --n; } // 保存第二段的头节点 pre_right = right; // 移到第二段的尾节点 while(right->next) { right = right->next; } // 第二段放前面,第一段放后面 // 建立连接 left->next = nullptr; right->next = pre_left; return pre_right; } };