LintCode : 旋转链表
题目
给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数
样例
给出链表1->2->3->4->5->null和k=2
返回4->5->1->2->3->null
思路
k对链表长度取余之后的结果是实际要移动的长度。考虑NULL和k=0的情况不用移动。剩下的情况我们在表头前开辟实际移动长度个空间,将尾部要移动的数据拷贝到表头前开辟的空间中。
代码
ListNode *rotateRight(ListNode *head, int k)
{
if(head == NULL)
return head;
int num = 0;
for(ListNode *i = head; i != NULL; i = i->next)
num++;
k = k % num;
if(k == 0 || num == 1)
return head;
ListNode *ans = (ListNode *)malloc(sizeof(ListNode));
ListNode *p = ans;
for(int i = 1; i < k; i++)
{
ListNode *temp = (ListNode *)malloc(sizeof(ListNode));
p->next = temp;
p = p->next;
}
p->next = head;
p = ans;
ListNode *tail = head;
ListNode *q = head;
int i = 0;
while(q != NULL)
{
if(i > k)
tail = tail->next;
q = q->next;
i++;
}
for(q = tail->next; q != NULL; q = q->next)
{
p->val = q->val;
p = p->next;
}
tail->next = NULL;
return ans;
}