原题链接:https://leetcode-cn.com/problems/rotate-list/
1、双指针法
相关题目:删除链表的倒数第N个节点
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL) return head;
ListNode *pre=new ListNode;
pre->next=head;
ListNode *p=head,*q=head;//p为前指针,q为后指针
int size=0;
while(q!=NULL){
q=q->next;
size++;
}
k=k%size;
if(k==0) return head;//若k为0或者为链表长度,则直接返回链表
q=head;
while(k--){//p和q之前保持k距离
q=q->next;
}
while(q->next!=NULL){//q一直走到最后一个链表结点
p=p->next;
q=q->next;
}
ListNode *tmp=p->next;//将(p:q]之间的节点移动到链表头部
q->next=pre->next;
pre->next=tmp;
p->next=NULL;
return pre->next;
}
2、闭合成环法
如上图(来源)
ListNode* rotateRight(ListNode* head, int k) {//将链表连成环,然后找到断开点断开,并设置头和尾。
if(head==NULL) return head;
ListNode *p=head;
int size=1;
while(p->next!=NULL){
p=p->next;
size++;
}
k=k%size;
if(k==0)return head;
p->next=head;
int count=size-k;
while(count--){
p=p->next;//找到断开点
}
head=p->next;//断开
p->next=NULL;
return head;
}