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.
这道题的思路是使用双指针
#include<iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
//ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k)
{
if(head==NULL||k==0)
return head;
ListNode *temp;
temp=head;
int num=0;
while(temp)
{
num++;
temp=temp->next;
}
k=k%num;
if(k==0)
return head;
ListNode * p,* q, * L;
p=head;
q=head;
int count=0;
while(q->next)
{
q=q->next;
count++;
if(count==k)
break;
}
//if(count<k)
// return head;
while(q->next)
{
p=p->next;
q=q->next;
}
q->next=head;
L=p->next;
p->next=NULL;
return L;
}
};
int main()
{
ListNode *head,*p,*q;
int x,i,N;
head=NULL;
cin>>N;
for(i=0;i<N;i++)
{
cin>>x;
p=(ListNode *)malloc(sizeof(ListNode));
p->val=x;
p->next=NULL;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
}
int k;
cin>>k;
Solution solve;
ListNode *L;
L=solve.rotateRight(head,k);
while(L)
{
cout<<L->val<<' ';
L=L->next;
}
cout<<endl;
return 0;
}
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (head == NULL || k == 0)
{
return head;
}
ListNode *dummy = new ListNode(-1);
dummy -> next = head;
ListNode *fast = head, *slow = head;
int listCount = countListLength(head);
k %= listCount;
if(k==0)
return head;
while (k --)
{
fast = fast -> next;
}
while (fast -> next)
{
fast = fast -> next;
slow = slow -> next;
}
dummy -> next = slow -> next;
fast -> next = head;
slow -> next = NULL;
return dummy -> next;
}
int countListLength(ListNode *head)
{
int count = 0;
while (head != NULL)
{
head = head -> next;
count ++;
}
return count;
}
};