

 思路:用快慢指针找到最后链表k个需要移动的节点,然后中间断开节点,原尾节点连接原头节点,返回新的节点即可;
 但因为k可能比节点数大,所以需要先统计节点个数,再取模,看看k到底需要移动多少个;
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
    //只有0或1个节点,直接返回原链表
        if(head == null || head.next == null) return head;
        ListNode fast = head;
        ListNode slow = head;
		//统计链表有多少个节点,因为k可能会超过节点数,所以需要取模计算;
        ListNode t = head;
        int size = 1; //节点数
        while(t.next!=null) {
            t = t.next;
            size++;
        }
        if(k%size == 0) return head; //如果k能整除,则不用移动,直接返回
         k = k%size; //k取 取模后的结果
		//双指针,slow和fast中间间隔k个节点
        while(fast.next!=null && k-- > 0) {
            fast = fast.next;
        }
        while(fast.next!=null) {
            fast = fast.next;
            slow = slow.next;
        }
        
        ListNode newHead = slow.next;//然后记录下新的头节点
        slow.next = null;//中间断开
        fast.next = head;//原尾节点和头节点连接
        return newHead;//返回新的头节点
    }
}
                

















