Rotate List

题目:

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/

原文地址:https://www.cnblogs.com/hygeia/p/4765157.html