#include <stdio.h>
#include <stdlib.h>
typedef struct numLink
{
int no;
struct numLink *next;
} NODE;
NODE *movenode(NODE *head, int m);
NODE *initLink(NODE *head, int n)
{
NODE *temp = head; //声明一个指针指向头结点,用于遍历链表
static NODE *last = NULL;
//生成链表
for (int i = 1; i <= n; i++)
{
NODE *a = (NODE *)malloc(sizeof(NODE));
a->no = i;
if (!last)
{
last = a;
temp->next = last;
}
else
last->next = a;
a->next = NULL;
last = a;
}
return temp;
}
int main()
{
int n = 0, m;
do
{
scanf("%d%d", &n, &m);
} while (n < 0 || m < 0);
if (m > n)
m = m % n;
NODE *head = (NODE *)malloc(sizeof(NODE)); //创建一个头结点
head->no = -1;
head->next = NULL;
NODE *p0 = initLink(head, n); //生成链表,数值从“1”到“n”
NODE *p = p0->next;
puts("移位前的链表:");
while (p)
{
printf("%d ", p->no);
p = p->next;
}
movenode(head, m);
p0 = p0->next;
puts("\n移位后的链表:");
while (p0)
{
printf("%d ", p0->no);
p0 = p0->next;
}
printf("\n");
return 0;
}
//移动指针比移动数据要简单得多
//链表的目的就移动数据要快速高效
#if 1
NODE *movenode(NODE *head, int m)
{
NODE *p = head->next, *p0 = head;
if (!p)
return NULL;
if (m < 1)
return head;
for (int i = 1; i < m; i++)
{
p = p->next;
}
NODE *tmp1 = p0->next;
p0->next = p->next;
NODE *pre = head, *p1 = head->next;
while (p1)
{
p1 = p1->next;
pre = pre->next;
}
pre->next = tmp1;
p->next = NULL;
return head;
}
#endif