给定一个链表,旋转链表,将链表每个节点向右移动 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;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
ListNode* ptr=head;
ListNode* end=head;
if(end==NULL)
return NULL;
int size=1;
//统计节点个数,同时获取链尾地址
while(end->next!=NULL){
size++;
end=end->next;
}
//获取需向左移动的次数
int dis=k%size;
//移动size*n次,等于不移动
if(dis==0)
return head;
//连环
end->next=ptr;
int i=1;
//向左移动dis次,等于向右移动size-dis次
while(i<size-dis){
ptr=ptr->next;
i++;
}
//确定头指针位置
head=ptr->next;
//断链
ptr->next=NULL;
return head;
}
};