题目介绍
给你一个链表的头节点 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
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ro… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
我的思路:
- 遍历链表,用一个数组存储每个节点
- 找到旋转的次数 k % 数组长度,如果是0就是没有旋转,直接返回
- 根据旋转的次数取出新节点头部的,
- 取出原来节点的尾部
- 断开新的头节点和前一个节点的连接
- 原来节点的尾部节点拼接原本的头部
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上的解题思路:
- 让头尾节点连接,形成一个环
- 找到旋转后的头节点的前一个节点, (k % size)
- 用变量存储上一步的节点的next节点,就是新的头部节点
- 设置第二步得到的节点的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
};