题目:
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
.
题解:
这道题主要先理解题意,就是倒着数k个node,从那开始到结尾和之前那部分对调,那个例子就是,4->5拿前面来,1->2->3拿后面去。
几个特殊:
k是可以大于整个list的长度的,所以这时要对k对len取模
如果取模之后得0,相当于不用rotate,直接返回
处理完特殊情况后,就用熟悉的faster/slower双指针解决就好(看到这种linkedlist,倒着数数的,就条件反射了)
先对faster设步长为n,然后faster和slower再一起走,知道faster.next==null,说明slower指向要倒着数的开始点的前一个位置。
所以slow.next就是要返回的newhead,保存一下。
然后把faster.next接到head上,slower.next存为null,作队尾。
这样就把list给rotate了。
这是我想的一种解法,还有一种就是把整个list连起来,变成环,找到切分点断开就行。
解法1:
1 public class Solution { 2 public ListNode rotateRight(ListNode head, int k) 3 { 4 if(head==null||head.next==null)return head; 5 ListNode newhead = new ListNode(0); 6 ListNode slow = head; 7 ListNode fast = head; 8 ListNode countlen = head; 9 int len = 0; 10 11 while(countlen!=null) 12 { 13 len++; 14 countlen=countlen.next; 15 16 } 17 18 k=k%len; 19 20 if(k==0)return head; 21 22 for(int i =0;i<k;i++) 23 { 24 fast=fast.next; 25 } 26 27 while(fast.next!=null) 28 { 29 slow=slow.next; 30 fast=fast.next; 31 } 32 33 newhead=slow.next; 34 fast.next=head; 35 slow.next=null; 36 37 return newhead; 38 39 } 40 }
解法2:
1 public ListNode rotateRight(ListNode head, int n) { 2 3 if (head == null || n == 0) 4 return head; 5 ListNode p = head; 6 int len = 1;//since p is already point to head 7 while (p.next != null) { 8 len++; 9 p = p.next; 10 } //结束后p在最后一个节点上 11 p.next = head; //form a loop 12 n = n % len; 13 for (int i = 0; i < len - n; i++) { 14 p = p.next; 15 } //now p points to the prev of the new head 16 head = p.next; 17 p.next = null; 18 return head; 19 }
reference: http://www.cnblogs.com/springfor/p/3864411.html
Reference for 2: http://leetcodenotes.wordpress.com/2013/08/14/leetcode-rotate-list-%E6%8A%8A%E5%90%8Ek%E4%B8%AArotate%E5%88%B0list%E5%89%8D%E9%9D%A2%E5%8E%BB%EF%BC%8Ck%E5%8F%AF%E4%BB%A5%E8%B6%85%E8%BF%87list%E6%9C%AC%E8%BA%AB%E9%95%BF%E5%BA%A6/