Given the head of a linked list, rotate the list to the right by
k
places. Example 1:
Input: head = [1,2,3,4,5], k = 2
Output: [4,5,1,2,3]
Example 2:
Input: head = [0,1,2], k = 4
Output: [2,0,1]
Constraints:
- The number of nodes in the list is in the range
[0, 500]
. - 100 <=
Node.val
<= 100 - 0 <=
k
<= 2 * 109
Java
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null) return head;
// 创建一个指针
ListNode pointer = head;
// 获取list size
int size = 1;
while(pointer.next != null) {
size++;
pointer = pointer.next;
};
// 获取实际rotate的次数
k %= size;
if(k == 0) return head;
// 此时,指针已处于list末尾,将末尾的node与第一个node连接起来
pointer.next = head;
// 将指针重新指向list原来的第一个node
pointer = head;
// 让指针指向rotate后的最后一个node
for(int i = 1; i < size - k; i++) {
pointer = pointer.next;
}
// 新的第一个node就是指针的下一个node
head = pointer.next;
// 将最后一个node的next指向null
pointer.next = null;
return head;
}
}
JavaScript
var rotateRight = function(head, k) {
if (head === null || head.next === null) return head;
let pointer = head;
// find the size of the list
let size = 1;
while (pointer.next !== null) {
size++;
pointer = pointer.next;
}
k %= size;
if(k === 0) return head;
pointer.next = head;
pointer = head;
for(let i = 1; i < size - k; i++)
pointer = pointer.next;
head = pointer.next;
pointer.next = null;
return head;
};
总结
- 题目本身难度是medium,不算难;
- 关键点还是要先画图,认真分析,有的比较完善的思路之后再来写代码。