给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
提示:
* 链表中节点的数目在范围 [0, 500] 内
* -100 <= Node.val <= 100
* 0 <= k <= 2 * 109
将链表首尾相连,仅需根据右移次数找到最后一个节点位置然后断开即可。**⭐首先要注意题给链表长度和k的范围**,右移k次后作为链表末尾节点的下标为:N - 1 - (k % N)。找此节点。命名新的头节点然后断开即可。
```java
class Solution {
// 1 2 3 4 5 k = 2
public ListNode rotateRight(ListNode head, int k) {
if(head == null){return null;}
ListNode cur = head;
int N = 1;
while(cur.next != null){
cur = cur.next;
N++;
}
k = k % N;
cur.next = head; // 找到尾节点,同时首尾相连。
while(N - k > 0){
cur = cur.next;
k++;
}
head = cur.next;
cur.next = null;
return head;
}
}
- 时间复杂度:O(n),最坏情况下,我们需要遍历该链表两次。
- 空间复杂度:O(1),我们只需要常数的空间存储若干变量。