给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置
题解:
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (k == 0 || head == nullptr || head->next == nullptr) { //增强健壮性
return head;
}
int n = 1;
ListNode* iter = head;
while (iter->next != nullptr) { //n用来统计链表结点的个数
iter = iter->next;
n++;
}
int add = n - k % n;
// 记给定链表的长度为 n,注意到当向右移动的次数 k≥n 时,我们仅需要向右移动 kmodn 次即可。因为每 n 次移动都会让链表变为原状。
if (add == n) {
return head;
}
iter->next = head; // 将链表闭环
while (add--) {
iter = iter->next;
}
ListNode* ret = iter->next;
iter->next = nullptr; // 链表开环后返回
return ret;
}
};