题目:
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
.
遍历两边链表,第一遍获取链表中元素的个数n,那么截断点为第n-k%n个元素的后面。
例如例子中的3,获取3后面的元素,并保存起来(记为newhead),将3的next置为null,然后从newhead开始遍历到最后一个元素,将他的后继置为原始的head即可。
需要注意的是,k %n == 0时,链表不需要移动。
public class No60_RotateList {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public static void main(String[] args){
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
ListNode n4 = new ListNode(4);
ListNode n5 = new ListNode(5);
n1.next = n2;
n2.next = n3;
// n3.next = n4;
// n4.next = n5;
ListNode head = rotateRight(n1, 2);
while(head != null){
System.out.print(head.val+" ");
head = head.next;
}
}
public static ListNode rotateRight(ListNode head, int n) {
if(head == null) return null;
int count = 0;
ListNode p = head;
ListNode pre = null;
for(;p!=null;count++){
p = p.next;
}
p = head;
n = n%count==0?count:n%count;
for(int i=0;i<count-n;i++){
pre = p;
p = p.next;
}
ListNode ret = p;
if(pre != null){
pre.next = null;
while(p.next != null) p = p.next;
p.next = head;
}
return ret;
}
}