(自用)单链表中的循环移位问题
作者:互联网
题目描述
顺序表的移位是循环移位,例如顺序表: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