Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given
return
Given
1->2->3->4->5->NULL and k = 2,return
4->5->1->2->3->NULL.Analysis:
The idea is to get the whole length of the list, then compute the rotate position.
And cut the list from the rotate position, link the front part to the last part.
e.g.
1->2->3->4->5->null , k =2;
len = 5;
rotate pos = 5-2 = 3;
cut list: 1->2->3 ---> 4->5->null
link : 4->5->1->2->3->null
Code:
/**
* 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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (head==NULL || k==0) {return head;}
ListNode* p = head;
int len=0;
//get total length
while (p!=NULL){
len++;
p=p->next;
}
//get rotate position
int r;
if (k%len==0){
return head;
}else{
r = len-(k%len)-1;
}
p=head;
while (r>0){
p=p->next;
r--;
}
//cut current list, link the back to the front
ListNode *q =p->next;
if (q==NULL){return head;}
while (q->next!=NULL){
q=q->next;
}
q->next = head;
q=p->next;
p->next=NULL;
return q;
}
};
No comments:
Post a Comment