乾坤大挪移:链表向右旋转n位

【问题】

给定一个单向链表,设计一个算法实现链表向右旋转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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值