LintCode : 旋转链表

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;
}

你可能感兴趣的:(LintCode,链表)