1 题目
Given a linked list, rotate the list to the right by k places, where k is non-negative.
2 尝试解
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head == NULL) return head;
ListNode* slow = head;
ListNode* fast = head;
int size = 1;
while(fast->next !=NULL){ //fast to the end, get the size of list
fast = fast->next;
size ++;
}
if(size <= k) {
k = k % (size);
}
int count = 1;
while(count < size - k){ //slow to the breakpoint
slow = slow->next;
count++;
}
if(slow != fast){
ListNode* start = slow->next;
fast->next = head;
slow->next = NULL;
return start;
}
return head;
}
};
3 标准解
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(!head) return head;
int len=1; // number of nodes
ListNode *newH, *tail;
newH=tail=head;
while(tail->next) // get the number of nodes in the list
{
tail = tail->next;
len++;
}
tail->next = head; // circle the link
if(k %= len)
{
for(auto i=0; i<len-k; i++) tail = tail->next; // the tail node is the (len-k)-th node (1st node is head)
}
newH = tail->next;
tail->next = NULL;
return newH;
}
};