给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4 输出:[2,0,1]
提示:
- 链表中节点的数目在范围
[0, 500]
内 -100 <= Node.val <= 100
0 <= k <= 2 * 109
思路:将尾节点和头节点连接起来,然后再找到新的头节点,并将这个新的头节点和前边的节点断开,返回这个头节点即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(k==0||head==nullptr)return head;
ListNode * p=head;
int len=0;
while(p->next)
{
p=p->next;
len++;
}
p->next=head;
int location=len-k%(len+1);
int sum=0;
ListNode * q;
while(1)
{
sum++;
if(sum==location+1)
{
q=head->next;
head->next=nullptr;
break;
}
else
{
head=head->next;
}
}
return q;
}
};