给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: 1->2->3->4->5->NULL, k = 2

输出: 4->5->1->2->3->NULL

解释:

向右旋转 1 步: 5->1->2->3->4->NULL

向右旋转 2 步: 4->5->1->2->3->NULL

示例 2:

输入: 0->1->2->NULL, k = 4

输出: 2->0->1->NULL

解释:

向右旋转 1 步: 2->0->1->NULL

向右旋转 2 步: 1->2->0->NULL

向右旋转 3 步: 0->1->2->NULL

向右旋转 4 步: 2->0->1->NULL

答案:

 1public ListNode rotateRight(ListNode head, int k{
2    if (head == nullreturn head;
3    int n = 1;
4    ListNode cur = head;
5    ListNode res = head;
6    while (cur.next != null) {
7        n++;
8        cur = cur.next;
9    }
10    cur.next = head; //搞成循环
11    k = k % n;
12    while ((n - k) > 0) {
13        k++;
14        res = res.next;
15    }
16    cur = res;
17    while (cur.next != res) {
18        cur = cur.next;
19    }
20    cur.next = null;
21    return res;
22}

解析:

记下head的位置,然后将单向链表搞成环,那么只要将head的位置向右移动(n-k%n)个位置,然后再将环解开成单向链表,最后返回。再来看一种写法

 1public ListNode rotateRight(ListNode head, int n) {
2    if (head == null || head.next == null) return head;
3    ListNode dummy = new ListNode(0);
4    dummy.next = head;
5    ListNode fast = dummy, slow = dummy;
6    int i;
7    for (i = 0; fast.next != null; i++)
8        fast = fast.next;
9    for (int j = i - n % i; j > 0; j--) 
10        slow = slow.next;
11    fast.next = dummy.next//Do the rotation
12    dummy.next = slow.next;
13    slow.next = null;
14    return dummy.next;
15}