给定一个链表,旋转链表,将链表每个节点向右移动 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
思路:
先把链表闭合成环,然后根据k找到节点并截断,使该节点下一个节点定义头指针,然后把此节点指向nullptr。
细节:把链表闭合成环的时候,计算链表的长度赋值为size,k%size计算出k大于size的时候,链表每个节点向右移动的位置数,断开位置的节点的位置的寻找的方法是,从尾节点开始的第k个位置,所以k=size - k%size。
由于从head开始遍历,while()循环条件判断为:k>1。
代码:
/**
* 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) {
if(!head || !head->next || k==0) return head;
ListNode* end = head;
ListNode* temp;
int size = 1;
while(end->next)
{
end = end->next;
size++;
}
k = size-k%size;
end->next = head;
end = end->next;
while(k-1>0)
{
end = end->next;
k--;
}
temp = end->next;
end->next = nullptr;
return temp;
}
};