https://leetcode-cn.com/problems/rotate-list/
[制卡]
具体过程如下:
1、首先遍历整个链表,求出链表的长度n,并找出链表的尾节点tail。
2、由于k可能很大,所以我们令 k = k % n,然后再次从头节点head开始遍历,找到第n - k个节点p,那么1 ~ p是链表的前 n - k个节点,p+1 ~ n是链表的后k个节点。
3、接下来就是依次执行 tail.next = head,head = p.next,p.next = nullptr,将链表的后k个节点和前 n - k个节点拼接到一块,并让head指向新的头节点(p->next),新的尾节点即p节点的next指针指向null。

4、最后返回链表的新的头节点head。
时间复杂度分析: 链表一共被遍历两次,因此总的时间复杂度为O(n)O(n),nn是链表的长度。
var rotateRight = function(head, k) {if (k === 0 || !head || !head.next) {return head;}let n = 1;let cur = head;// 循环获取链表的长度while (cur.next) {cur = cur.next;n++;}// 循环结束: 此时cur就是链表末节点tail// 末节点的next 指向 headcur.next = head;// 找到 P 的位置就是;P 就是第add个位置let add = n - k % n;while (add) {cur = cur.next;add--;}// 循环结束:此时cur就是P的值; 刚好就是headconst ret = cur.next;cur.next = null; // 把 P 的next 去掉;return ret;};
