解题思路:
1.找到原链表的最后一个节点
2.计算链表长度n
3.将原链表的尾节点指向链表的头节点,使链表形成环
4.新链表根据画图可知,会在环的(n-k%n)的地方断开,这个节点newtail是新链表的尾节点
5.将新尾节点的后驱置为新的头节点newhead,然后新尾节点指向空
6.返回新的头节点newhead即可
源代码如下:
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL||head->next==NULL||k==0)
{
return head;
}
ListNode* newtail=head;//新的尾巴
ListNode* tail=head;//旧的尾巴
ListNode* newhead;//新的头节点
int n=1;//链表长度
//先找到原链表的尾巴,同时计算链表长度
while(tail->next!=NULL)
{
tail=tail->next;
n++;
}
//将旧的尾巴指向头节点,使链表变成环
tail->next=head;
//找到旋转链表后需要断开的节点的位置
//因为如果旋转的k等于链表长度n的话,相当于没转,所以这里要取余
for(int i=0;i<n-k%n-1;i++)
{
newtail=newtail->next;
}
//找到后,将断开的节点的下一个节点置为新的头节点
newhead=newtail->next;
//断开的节点的后驱置为空
newtail->next=nullptr;
//返回新的头节点即可
return newhead;
}
};