给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4 输出:2->0->1->NULL
解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步:0->1->2->NULL
向右旋转 4 步:2->0->1->NULL
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k){
struct ListNode* tmp=head,*begin,*end;
int size=0;
while(tmp)
{
end=tmp;
size++;
tmp=tmp->next;
}
if(size==0)return head;
int offset=k%size;
if(offset==0)
{
return head;
}
else
{
offset=size-offset;
tmp=head;
while(offset>0)
{
begin=tmp;
offset--;
tmp=tmp->next;
}
//新的头节点
tmp=begin->next;
//将尾部节点赋空值
begin->next=NULL;
//拼接 原来的头节点
end->next=head;
}
return tmp;
}
执行用时 : 8 ms, 在Rotate List的C提交中击败了96.26% 的用户
内存消耗 : 7.6 MB, 在Rotate List的C提交中击败了73.03% 的用户