这道题其实就是如何灵活地在链表中定位。

具体实现思路如下:

  1. 右移k个结点,首先要确定链表的总长度,还要把k值变换为合理的k(即进行取余操作,因为有可能k > 链表总长)。
  2. 把第k个之后的结点斩断,放到链表的前面。
  3. 要完成第2步,需要注意链表next域的连接,比如在确定总长度时,可以让最后一个结点连接到第一个让它成环,然后再让原链表的第k-1个断开,指向null,返回它的下一个结点。

注意细节即可。

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode ans = null;
        ListNode p = head;
        // 计算长度
        int count = 1;
        while(p.next != null){
            p = p.next;
            count++;
        }
        // 先让链表成环,接下来再遍历到倒数第k个结点处理
        p.next = head;
        // 取余,可能存在k>count的情况
        k = k % count;
        // 遍历到新链表的末尾
        for(int i = 0;i < count - k;i++){
            p = p.next;
        }
        ans = pre.next;
        // 尾为null
        p.next = null; 
        return ans;
    }
}