LintCode : 旋转链表

来源:互联网 发布:2016cydia软件源 编辑:程序博客网 时间:2024/05/22 16:55

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;}
0 0
原创粉丝点击