leetcode_rotate_list

难度:Medium

解题思路:翻转很简单,把边界都考虑周到比较难。k=0的情况如何处理,还有要对k取余。

dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> NULL k=4
              ^    ^                   ^
              |    |                   |
             pre  first               second


  |---------------<--------------------|
  |                                    |
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7   NULL
              ^    ^                   ^
              |    |                   |
             pre  first               second

  |---------------<--------------------|
  |                                    |
dummy    1 -> 2 -> 3 ->  4 -> 5 -> 6 -> 7   NULL
  |           ^    ^                    ^
  |           |    |                    |
  |          pre  first               second
  |                |
  |-------->-------|       


         |-----------<--------------------------|
         |                                      |
dummy    1 -> 2 -> NULL    3 ->  4 -> 5 -> 6 -> 7   NULL
  |           ^            ^                    ^
  |           |            |                    |
  |          pre         first               second
  |                        |
  |-------->---------------|       

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(k == 0 || head == NULL ||head->next == NULL) return head;

ListNode *dummy = new ListNode(-1);
dummy->next = head;

int length = 0;
ListNode *cur= dummy;
while(cur ->next != NULL)
{
length++;
cur = cur->next;
}
k = k % length;
if(k == 0) return head;

ListNode *pre_first = dummy, *first = dummy, *second = dummy;
for(int i = 0; i < k; i++)
{
if(second->next != NULL)
second = second->next;
}
first = dummy->next;
while(second->next != NULL)
{
pre_first = first;
first = first->next;
second = second->next;
}
if(pre_first == dummy)
return dummy->next;
second->next = dummy->next;
dummy->next = first;
pre_first->next = NULL;
return dummy->next;
}
};

代码结果:9ms,超过24.72%