/**
* 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;
}
};