自学内容网 自学内容网

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

};


原文地址:https://blog.csdn.net/qq_62541773/article/details/143495610

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!