https://leetcode-cn.com/problems/rotate-list/
    [制卡]
    具体过程如下:

    1、首先遍历整个链表,求出链表的长度n,并找出链表的尾节点tail。
    day007 链表旋转 - 图1

    2、由于k可能很大,所以我们令 k = k % n,然后再次从头节点head开始遍历,找到第n - k个节点p,那么1 ~ p是链表的前 n - k个节点,p+1 ~ n是链表的后k个节点。
    day007 链表旋转 - 图2

    3、接下来就是依次执行 tail.next = head,head = p.next,p.next = nullptr,将链表的后k个节点和前 n - k个节点拼接到一块,并让head指向新的头节点(p->next),新的尾节点即p节点的next指针指向null。

    day007 链表旋转 - 图3

    4、最后返回链表的新的头节点head。

    时间复杂度分析: 链表一共被遍历两次,因此总的时间复杂度为O(n)O(n),nn是链表的长度。

    1. var rotateRight = function(head, k) {
    2. if (k === 0 || !head || !head.next) {
    3. return head;
    4. }
    5. let n = 1;
    6. let cur = head;
    7. // 循环获取链表的长度
    8. while (cur.next) {
    9. cur = cur.next;
    10. n++;
    11. }
    12. // 循环结束: 此时cur就是链表末节点tail
    13. // 末节点的next 指向 head
    14. cur.next = head;
    15. // 找到 P 的位置就是;P 就是第add个位置
    16. let add = n - k % n;
    17. while (add) {
    18. cur = cur.next;
    19. add--;
    20. }
    21. // 循环结束:此时cur就是P的值; 刚好就是head
    22. const ret = cur.next;
    23. cur.next = null; // 把 P 的next 去掉;
    24. return ret;
    25. };