首先确定旋转次数:旋转次数大于链表大小的都要进行求余处理;旋转次数等于链表大小的约等于没转,直接咋来咋return;旋转次数小于链表大小的才是正常情况。
然后找到转完的、新链表的头结点。这一点参考寻找倒数第k个结点,很容易理解。
最后就是连接旧链表头尾,断开新链表头尾。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(!head) return head; //判空
if(k == 0) return head; //判零(逗我玩呢)
if(!head->next) return head; //判单个
ListNode* it = head; //用于计算链表大小的指针
int sz = 0; //存储链表的大小
while(it){ //计算链表大小
it = it->next;
sz += 1;
}
if(sz < k){ //求余,旋转次数大于链表大小的一律和旋转次数是余数的情况一样
k %= sz;
}else if(sz == k){ //判断链表大小和旋转次数一样的也是逗我玩的
return head;
}
ListNode* fast = head; //双指针找到转完后的头结点(详见寻找倒数结点)
ListNode* slow = head;
while(k--){
fast = fast->next;
}
while(fast->next){
fast = fast->next;
slow = slow->next;
}
fast->next = head; //旧链表首尾相连
it = slow->next; //存储新头结点
slow->next = nullptr; //断开形成新链表
return it;
}
};