[路飞]_61. 旋转链表

135 阅读1分钟

题目介绍

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k **个位置。

示例1:

rotate1.jpg

输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]

示例2:

roate2.jpg

输入:head = [0,1,2], k = 4
输出:[2,0,1]

 

提示:

链表中节点的数目在范围 [0, 500] 内 -100 <= Node.val <= 100 0 <= k <= 2 * 109

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ro… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

我的思路:

  1. 遍历链表,用一个数组存储每个节点
  2. 找到旋转的次数 k % 数组长度,如果是0就是没有旋转,直接返回
  3. 根据旋转的次数取出新节点头部的,
  4. 取出原来节点的尾部
  5. 断开新的头节点和前一个节点的连接
  6. 原来节点的尾部节点拼接原本的头部
    var rotateRight = function(head, k) {
      if (!head) return null
      let oldHead = head
      let arr = []
      while(head) {
          arr.push(head)
          head = head.next
      }
      // if (arr.length === 1 || k === 0) return oldHead
      let $k = k % arr.length
      // 如果是0说明没有旋转直接返回
      if ($k === 0) {
        return oldHead
      }
      // 取出新节点的头部
      let newHead = arr[arr.length - $k]
      // 取出原来节点的尾部
      let endNode = arr[arr.length - 1]
      // 断开新的头节点和前一个节点的连接
      arr[arr.length - $k - 1].next = null
      // 原来节点的尾部节点拼接原本的头部
      endNode.next = oldHead
      return newHead
    };

leetCode上的解题思路:

  1. 让头尾节点连接,形成一个环
  2. 找到旋转后的头节点的前一个节点, (k % size)
  3. 用变量存储上一步的节点的next节点,就是新的头部节点
  4. 设置第二步得到的节点的next为null
    var rotateRight2 = function(head, k) {
      if (!head) return null
      let cur = head, size = 1
      while(cur.next) {
        cur = cur.next
        size += 1
      }

      cur.next = head

      for (let i = 0; i < size - k % size - 1; i++) {
        head = head.next
      }

      cur = head.next
      head.next = null
      return cur
    };