Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL
and k = 2
,
return 4->5->1->2->3->NULL
.
Have you met this question in a real interview?
Analysis:
Assume the length of the list is len, we need to consider the situation that k > len which means to rotate the right k%n steps. Since rotate operation is a kind of circling operation. We first count the length of the list, and connect end to head to make the list as a circle. Then, we only need to move forward by len-k%len steps to reach the new end of the list. Now the next node is the new head.
Solution:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 public ListNode rotateRight(ListNode head, int n) { 14 if (head==null || head.next==null) return head; 15 16 ListNode end = null; 17 int len = 1; 18 end = head; 19 while (end.next!=null){ 20 end = end.next; 21 len++; 22 } 23 end.next = head; 24 int step = len - n%len; 25 int index = 1; 26 end = head; 27 while (index<step){ 28 end = end.next; 29 index++; 30 } 31 head = end.next; 32 end.next = null; 33 return head; 34 } 35 }