算法思想:对于循环链表,左移K位,循环链表中的第K+1个结点将变成链表的第一个结点,所以只要将头指针指向循环链表第K+1个结点即实现循环左移K的操作。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
}LinkNode, * LinkList;
void creatLinkList(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = L;
int num;
scanf("%d", &num);
L->data = num;
LinkNode* ptail = L;
while (scanf("%d", &num) && num < 99999) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = ptail->next;
ptail->next = pnode;
ptail = pnode;
}
}
void printLinkList(LinkList L) {
LinkNode* pnode = L;
printf("%d ", pnode->data);
pnode = pnode->next;
while (pnode != L) {
printf("%d ", pnode->data);
pnode = pnode->next;
}
printf("\n");
}
/*算法思想:对于循环链表,左移K位,循环链表中的第K+1个结点将变成链表的第一个结点,
所以只要将头指针指向循环链表第K+1个结点即实现循环左移K的操作*/
void move(LinkList &L, int K) {
LinkNode* pnode = L;
int cnt = 1;
while (cnt < K) {
pnode = pnode->next;
cnt += 1;
}
L = pnode->next;
}
int main() {
LinkList L = NULL;
creatLinkList(L);
int K;
scanf("%d", &K);
printLinkList(L);
move(L, K);
printLinkList(L);
return 0;
}