根据题意,我们可以假设链表是:1−>2−>3−>4−>5,移动位是 k,我们分析如下:
- k<5 的情况:实际移动的位数,就是 k 本身。
- k>5 的情况:
- k 是 5 的整数倍:链表不会发生位置变化。
- k 不是 5 的整数倍:实际移动位数是 k%5 的值。
知道了上述的分析,我们很容易就能理清思路,流程如下:
- 计算链表的长度
- 链表最后一位值的 next 指向原链表首位数字,形成闭环,如下所示:
// 环图
1 -> 2 -> 3 -> 4 -> 5
↑ ↓
↑ ↓
← ← ← ← ← ←
// 线性图
1 -> 2 -> 3 -> 4 -> 5 -> 1 -> 2 -> 3 -> 4 -> 5 -> 1 -> 2 -> 3 -> 4 -> 5 -> ....- 创建一个变量,接收从 k 处截断后的链表,假设 k=2,我们就会从 3 这里处截断,然后 3 的 next 指向 null 即可,所以该变量的值是 4−>5−>1−>2−>3−>null。
javascript
/**
* 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) {
if (!head || !head.next || !k) return head
let len = 1,
cur = head
while (cur.next) {
cur = cur.next
len++
}
let move = len - (k % len)
cur.next = head
while (move) {
cur = cur.next
move--
}
let ans = cur.next
cur.next = null
return ans
}