1 /**
2 * Definition for singly-linked list.
3 * function ListNode(val, next) {
4 * this.val = (val===undefined ? 0 : val)
5 * this.next = (next===undefined ? null : next)
6 * }
7 */
8 /**
9 * @param {ListNode} head
10 * @param {number} k
11 * @return {ListNode}
12 */
13 var rotateRight = function (head, k) {
14 // 链表为空 || 链表只有一个节点 || 旋转数量为0
15 if (!head || !head.next || k === 0) {
16 return head;
17 }
18 // 使用一个指针,统计链表长度
19 let node = head;
20 // 统计节点数量,指针初始指向头结点,因此初始值为1
21 let length = 1;
22
23 // 不断移动指针,但它停在尾结点时,完成链表长度的统计
24 while (node.next) {
25 node = node.next;
26 length++;
27 }
28 let rotate = k % length; // 链表旋转节点数量,k可能大于链表长度,因此需要取余
29
30 // 如果rotate为0,无需旋转,直接返回即可
31 if (rotate === 0) {
32 return head;
33 }
34
35 // 将尾结点与头结点连接,让链表形成环
36 node.next = head;
37 let breakNode = head; // 使用指针,最终会指向断点位置
38 let breakPoint = length - rotate - 1; // 将指针移动到断点位置所需次数
39
40 // 将指针移动到断点位置
41 while (--breakPoint >= 0) {
42 breakNode = breakNode.next;
43 }
44
45 // 链表的新头结点,就在断点位置的下一个节点
46 const newHead = breakNode.next;
47 // 将链表的环打断
48 breakNode.next = null;
49
50 // 返回新链表
51 return newHead;
52 };