其他分享
首页 > 其他分享> > (自用)单链表中的循环移位问题

(自用)单链表中的循环移位问题

作者:互联网

题目描述
顺序表的移位是循环移位,例如顺序表:1,2,3,4,5,6。如果左移1位,即原来的头元素移动到末尾,其它元素向左移1位,变成2,3,4,5,6,1。同理,如果右移1位,即原来的尾元素移动到头,其它元素向右移1位,变成6,1,2,3,4,5。以下是移位的多个例子:

原数据:1,2,3,4,5,6

左移3位:4,5,6,1,2,3,与原数据对比

右移4位:3,4,5,6,1,2,与原数据对比

请编写程序实现顺序表的循环移位操作

输入
第1行输入n表示顺序表包含的·n个数据

第2行输入n个数据,数据是小于100的正整数

第3行输入移动方向和移动的位数,左移方向为0,右移方向为1

第4行输入移动方向和移动的位数,左移方向为0,右移方向为1

注意:移动操作是针对上一次移动后的结果进行的 

最开始的想法:每次移位都把尾元素移到头元素,但这样的话for循环里又需要一个while循环:

void Move(node* H) {
	node* temp, * pend, * head;
	int direction, step;
	scanf("%d", &direction);
	scanf("%d", &step);
	if (direction) {
		for (int i = 0; i < step; i++) {
			pend = H;
			head = H->next;
			while (pend->next->next)
				pend = pend->next;
			temp = pend->next;
			pend->next = NULL;
			H->next = temp;
			temp->next = head;
		}
	}
	else {
		for (int i = 0; i < step; i++) {
			head = H->next->next;
			temp = H->next;
			pend = H;
			while (pend->next)
				pend = pend->next;
			H->next = head;
			pend->next = temp;
			pend = pend->next;
			pend->next = NULL;
		}
	}
}

复杂度会是O(n²),于是博采众长一番,做如下改进:

void Move(node* H, int n) {
	node* temp, * pend, * head;
	int direction, step;
	temp = (node*)malloc(sizeof(node));
	scanf("%d", &direction);
	scanf("%d", &step);
	int i = 0;
	pend = H;
	if (direction) {
		while (pend->next) {
			pend = pend->next;
			i++;
			if (i == n - step) {
				temp = pend->next;
				pend->next = NULL;
			}
		}
	}
	else {
		while (pend->next) {
			pend = pend->next;
			i++;
			if (i == step) {
				temp = pend->next;
				pend->next = NULL;
			}
		}
	}
	head = H->next;
	H->next = temp;
	while (temp->next)
		temp = temp->next;
	temp->next = head;
}

 把要移到头部的几个尾元素一起移动,这样就只需要一个循环就能完成。并且左移和右移操作的区别只用i来区分,其他操作都一样,可谓是非常的多态

标签:右移,head,单链,temp,next,step,pend,自用,表中
来源: https://blog.csdn.net/liou2134/article/details/123307383