【Leetcode】【Medium】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.

 

解题思路:

题目看上去很简单,但是需要注意一下点:

1、任何输入都有可能,即使是无效的输入(例如链表为空,k不为0),所以程序开始时的检查在任何时候都非常重要。

2、另一个边界条件,就是是否在空指针中,使用了->next操作,很多链表错误都发生在此处。

3、K是旋转的结点数,因此K可能大于整个链表的结点数。

4、K不仅可能大于结点数,还可能非常大,因此传统的循环耗费时间太多,要对K做取余操作。

代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* rotateRight(ListNode* head, int k) {
12         if (k == 0 || !head)
13             return head;
14         ListNode* pre = head;
15         ListNode* last = head;
16         int num = 1;
17         while (k--) {
18             if (last->next) {
19                 num++;
20                 last = last->next;
21             } else {
22                 k = k % num;
23                 last = head;
24             }
25         }
26         
27         while (last->next) {
28             pre = pre->next;
29             last = last->next;
30         }
31         
32         last->next = head;
33         head = pre->next;
34         pre->next = NULL;
35         return head;
36     }
37 }

 

posted @ 2015-05-19 03:10  胡潇  阅读(159)  评论(0编辑  收藏  举报