题目描述:
解题思路:
(1)遍历链表求长度len,因为k可能大于len
(2)将整个链表形成一个环
(3)然后遍历链表,走到len-k处断开链表返回即可
首先写主函数:
int main(){
int k;
cin>>k;
ListNode *head=createByTail();
head=Solution().rotateRight(head);
DisplayLink(head);
return 0
}
题目要求用不带头结点的链表,所以依旧沿用第一题的createbyTail()函数。
ListNode *createByTail(){
ListNode *head;
ListNode *p;
ListNode *tail;
int len;
cin>>len;
int n=0,num;
head=NULL;
while(n<len &&cin>>num){
p=new ListNode;
p->val=num;
p->next=NULL;
n=n+1;
if(n==1){
head=p;
}
else{
tail->next=p;
}
tail=p;
}
return head;
创建好链表之后,就进入我们的主要算法思路了:
(1)遍历链表求长度len,因为k可能大于len
(2)将整个链表形成一个环
(3)然后遍历链表,走到len-k处断开链表返回即可
ListNode *rotateRight(ListNode *head){
if(head==NULL || k==0){
return head;
}
int len=1;
ListNode *p=head;
while(p->next){
len++;
p=p->next;
}
//上面就是求链表的长度,然后开始将链表变为循环链表
p->next=head;//这一句代码就是形成循环链表
k=len-k%len;//如果k>len的话,求模就行,比如k=6,len=5,其实质还是说将原链表向右移动一位,
//即k%len,让len-k是说本来是向右移动k位的话,是应该让倒数第k个结点成为头结点的,len-k就是倒数第k个结点。
for(int i=0;i<k;i++){
p=p->next;
}
head=p->next;
p->next=NULL;
return head;
}
完整代码:
#include<iostream>
using namespace std;
//旋转链表
//算法思路:
//(1)遍历链表求长度len,因为k可能大于len
//(2)将整个链表形成一个环
//(3)然后遍历链表,走到len-k处断开链表返回即可
struct ListNode{
int val;
ListNode *next;
};
class Solution{
public:
ListNode *rotateRight(ListNode *head,int k){
if(head==NULL || k==0){
return head;
}
int len=1;
ListNode *p=head;
while(p->next){
len++;
p=p->next;
}
p->next=head;//形成循环链表
k=len-k%len;//在len-k处断开链表
//比如现在list1=1,2,3,4,5 即len=5,k=2,那么在k=3处断开链表
//断开链表的操作就是 将第k个结点的next指针赋值为head头结点,第k个作为尾结点
for(int i=0;i<k;i++){
p=p->next;
}
head=p->next;
p->next=NULL;
return head;
}
};
ListNode *createBytail(){
ListNode *head;
ListNode *p,*tail;
int len;
cin>>len;
int n=0,num;
head=NULL;
while(n<len && cin>>num){
p=new ListNode;
p->val=num;
p->next=NULL;
n=n+1;
if(n==1){
head=p;
}
else{
tail->next=p;
}
tail=p;
}
return head;
}
void displayLink(ListNode *head){
ListNode *p=head;
cout<<"head-->";
while(p!=NULL){
cout<<p->val<<"-->";
p=p->next;
}
cout<<"tail\n";
}
int main(){
int k;
ListNode *head=createBytail();
cin>>k;
head=Solution().rotateRight(head,k);
displayLink(head);
return 0;
}