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
.
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
if (head == NULL || head->next == NULL || k == 0)
return head;
ListNode *pbeforeslow = head;
ListNode *pslow = head;
ListNode *pfast = head;
int i = 1;
for (; i < k; ++i) {
if (pfast->next == NULL)
break;
pfast = pfast->next;
}
if (i == k) {
if (pfast->next == NULL)
return head;
while (pfast->next != NULL) {
pbeforeslow = pslow;
pslow = pslow->next;
pfast = pfast->next;
}
pfast->next = head;
pbeforeslow->next = NULL;
return pslow;
}
else {
int len = i - k % i;
pfast->next = head;
for (int j = 0; j < len; ++j) {
pfast = pfast->next;
}
head = pfast->next;
pfast->next = NULL;
return head;
}
}
};
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
if (head == NULL || head->next == NULL || k == 0)
return head;
ListNode *pfast = head;
int count = 1;
while (pfast->next != NULL) {
pfast = pfast->next;
++count;
}
pfast->next = head;
int len = count - k % count;
for (int i = 0; i < len; ++i) {
pfast = pfast->next;
}
head = pfast->next;
pfast->next = NULL;
return head;
}
};