题目描述:
Given a list, rotate the list to the right by k
places, where k is non-negative.
Example
题目思路:
Given 1->2->3->4->5
and k = 2
, return 4->5->1->2->3
.
这题就是考一下linked list的操作问题:我这里先get一个list的长度,然后算出真正的k(因为k可能超过list的长度,这里希望有个真正的k范围在0~len-1之内)。找到之后再用两个指针找出新的head,然后几个nodes转换一下linking关系就好了。
Mycode(AC = 12ms):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param head: the list
* @param k: rotate to the right k places
* @return: the list after rotation
*/
ListNode *rotateRight(ListNode *head, int k) {
// write your code here
if (head == NULL) return NULL;
// find the total length of the list
int len = 0;
ListNode *ptr = head;
while (ptr) {
ptr = ptr->next;
len++;
}
// find the real k which is in range of 0 ~ length - 1
int real_k = k % len; // real_k = 2
if (real_k == 0 || len == 1) return head;
// find the position of new head (where starts rotate)
ListNode *slow = head, *fast = head;
while (real_k > 0) {
fast = fast->next; // fast->3
real_k--;
}
while (fast->next) {
slow = slow->next; // slow->3
fast = fast->next; // fast->5
}
// do rotating
ListNode *dummy = new ListNode(0);
dummy->next = slow->next;
slow->next = NULL;
fast->next = head;
return dummy->next;
}
};