【问题】
给定一个单向链表,设计一个算法实现链表向右旋转K个位置。K是非负的整数。这题看起来简单,可真编程实现有陷阱啰。 举例: 给定:1->2->3->4->5->6->null 并且K=3, 则有:4->5->6->1->2->3->null。
【分析】
这个题目其实并不难,主要是需要处理特殊情况:
1.链表长度为0
2.K>链表的长度
3.K=0
在处理的时候,首先我们应该去遍历一遍链表找到链表的尾指针并得到链表的长度,这时,如果需要旋转的话则将链表尾指针指向头指针形成一个环,这样找到需要断开的位置,赋值给头指针即可。
故直接将我写的代码放在这:
#include<iostream>
using namespace std;
struct LinkNode{
int val;
LinkNode* next;
LinkNode(int x):val(x), next(NULL){}
};
void RorateList(LinkNode* &head,int n){
if(head == NULL)
return ;
int shift = 0;
int length = 0;
LinkNode* p = head;
while(p->next!=NULL){
p = p->next;
length++;
}
length++;
if(n>0 && n%length !=0)
shift = length - n%length;
else
return;
p->next = head;//使链表收尾相连成环
p = head;
int i=1;
while(i<shift){
p = p->next;
i++;
}
head = p->next;
p->next = NULL;
}
void PrintList(LinkNode* head){
while(head!=NULL){
cout<<head->val<<" ";
head = head->next;
}
cout<<endl;
}
int main()
{
int A[6] = {1,2,3,4,5,6};
LinkNode*head = new LinkNode(1);
LinkNode*p = head;
for(int i =1;i<6;i++){
head->next = new LinkNode(A[i]);
head = head->next;
head->next = NULL;
}
// PrintList(p);
// for(i=0;i<13;i++){
head = p;
RorateList(head,8);
PrintList(head);
// }
return 0;
}