给定一个链表,旋转链表,将链表每个节点向右移动 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 == null) return 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}