summary:
two pointers
package myapp.kit.leetcode.top200;
import myapp.kit.leetcode.base.ListNode;
/**
*
* 61
* medium
* https://leetcode.com/problems/rotate-list/
*
* Given a linked list, rotate the list to the right by k places, where k is non-negative.
*
* Example 1:
*
* Input: 1->2->3->4->5->NULL, k = 2
* Output: 4->5->1->2->3->NULL
* Explanation:
* rotate 1 steps to the right: 5->1->2->3->4->NULL
* rotate 2 steps to the right: 4->5->1->2->3->NULL
* Example 2:
*
* Input: 0->1->2->NULL, k = 4
* Output: 2->0->1->NULL
* Explanation:
* rotate 1 steps to the right: 2->0->1->NULL
* rotate 2 steps to the right: 1->2->0->NULL
* rotate 3 steps to the right: 0->1->2->NULL
* rotate 4 steps to the right: 2->0->1->NULL
*
*
*
* @author huangdingsheng
* @version 1.0, 2020/7/3
*/
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
public class rotate_list_61 {
public ListNode rotateRight(ListNode head, int k) {
ListNode answer;
int cn = count(head);
// corner case
if (cn == 0 || k == 0) {
return head;
}
// reduce scale
k = k % cn;
int firCn = cn - k;
ListNode fir = head;
while (firCn > 1) {
fir = fir.next;
firCn--;
}
ListNode sec = fir.next;
// corner case
if (sec == null) {
return head;
}
answer = sec;
fir.next = null;
while (sec.next != null) {
sec = sec.next;
}
sec.next = head;
return answer;
}
private int count(ListNode head) {
ListNode curr = head;
int cn = 0;
while (curr != null) {
cn++;
curr = curr.next;
}
return cn;
}
}