给定一个单向链表,设计一个算法实现链表向右旋转K个位置。
举例:
给定:1->2->3->4->5->6->null 并且K=3,
则有:4->5->6->1->2->3->null。
struct Node
{
int value;
Node *next;
};
Node* revert(Node *head, unsigned int k)
{
if (head == NULL
|| k == 0)
{
return head;
}
int len = 0;
Node *p = head;
Node *q = head;
while (p->next != NULL)
{
len++;
p = p->next;
if (len >= k+1)
{
q = q->next;
}
}
Node *tail = p;
if (k%(len+1) == 0)
{
return head;
}
if (len+1 > k)
{
tail->next = head;
Node *temp = q->next;
q->next = NULL;
return temp;
}
p = head;
k = k%(len+1);
int steps = len-k;
while (steps)
{
p = p->next;
steps--;
}
tail->next = head;
Node *temp = p->next;
p->next = NULL;
return temp;
}