主要思路是,先把尾结点连到头结点上,形成一个环,然后找到正确的新的头结点位置,再断开。
这里主要是要推一个公式,新链表的尾结点在原链表中的位置
[0 1 2 3 4], k = 3, n = 5
[0 1] 2 3 4
[2 3 4 0 1] 2 3 4
这里先看 k
,首先右移的距离很轻松判断出是k%n
,当右移k%n
后,原数组还剩 n - k%n
,对应的下标是 n - k%n - 1
,所以原数组下标为 n - k%n - 1
的节点就是最后一个节点,这个节点的下一个节点就是新的头结点,从这个节点之后断开即可。
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
ListNode* last = head;
int n = 1;
while(last->next != nullptr) {
last = last->next;
n += 1;
}
if (k % n == 0) return head;
last->next = head;
int num = (n - 1) - k % n;
while(num --) {
head = head->next;
}
last = head->next;
head->next = nullptr;
return last;
}
};