js.轮转数组和旋转链表
这是两个相似的题型,一个是数组,另一个是链表。
链接:189. 轮转数组 - 力扣(LeetCode)
题目:
给定一个整数数组
nums
,将数组中的元素向右轮转k
个位置,其中k
是非负数。示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4]
解释: 向右轮转 1 步:[7,1,2,3,4,5,6]
向右轮转 2 步:[6,7,1,2,3,4,5]
向右轮转 3 步:[5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
思路:
首先分为两种情况来写,
1 数组长度比k大,先取出数组的后k个值复制到新的数组。让第nums.length-1-i的值,等于它的第前k的值。再将新数组的值赋值到nums的前k个值。
2 长度比k小,反复让k减去数组长度,直到数组长度大于k。
代码:
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
while(nums.length<=k) {
k -= nums.length
}
let newarr = nums.slice(nums.length-k,nums.length)
for(let i = nums.length-1 ; i >= k ; i-- ){
nums[i] = nums[i-k]
}
while(k){
nums[k-1] = newarr[k-1]
k--
}
};
第二题:
链接:61. 旋转链表 - 力扣(LeetCode)
题目:
给你一个链表的头节点
head
,旋转链表,将链表每个节点向右移动k
个位置。示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]示例 2:
输入:head = [0,1,2], k = 4 输出:[2,0,1]提示:
- 链表中节点的数目在范围
[0, 500]
内-100 <= Node.val <= 100
0 <= k <= 2 * 109
代码:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var rotateRight = function(head, k) {
let sum = 0 , l = last = head
while(l){
sum++
if(l.next==null) last = l
l = l.next
}
while(k>=sum&&k&&sum){
k-=sum
}
if(k==0||!head) return head
l = head
let num = sum - k , q = l
while(num--){
if(num==0){
q = l
l = l.next
q.next = null
}else{
l = l.next
}
}
last.next = head
return l
};