首先,对于题目中的例子来说,向右移动6位和向右移动1位是一样的,所以要预先处理k,让k对链表长度取余。
然后,让p结点移动到后面链表的头位置,此时q指向前面链表的头位置。之后,p和q同时移动,直到p移动到了NULL,此时q指向的结点正好是第一个链表的尾巴,从此处分开两个链表
class Solution {
public:
int getLenth(ListNode* head)
{
int n=0;
ListNode*p=head;
while(p)
{
n++;
p=p->next;
}
return n;
}
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL) return head;//无需旋转
int n=getLenth(head);
k=k%n;//k值对链表长度取余
if(k==0) return head;//无需旋转
ListNode*p=head,*q=head;
for(int i=0;i<=k;i++) p=p->next;//p走k+1步到后面链表的头结点
while(p) p=p->next,q=q->next;//p和q同时向后移动,直到p指向NULL
//开始将后面的链表往前移动
p=q->next;//p指向后面链表的头部
q->next=NULL;//将前面的链表处理完毕,q已经没有用了
q=p;//用q来找后面链表的尾巴
while(q->next) q=q->next;//用来找后面链表的尾部
q->next=head;//将后面链表的尾巴指向前面链表的头
return p;
}
};