/*
题目:设计一个算法,将循环单链表中的每个结点左移k。
出自:2020东北大学软件工程858考研真题第1题
*/
//思路:将题目转化为移动头结点位置,如 头->1->2->3 左移1 1->头->2->3
//宏定义
#define ElemType int
//单链表定义
typedef struct LNode{
ElemType val;
struct LNode*next;
}*LinkList,LNode;
[注] 上述宏定义和结构体定义是答题时要写的答案,并不是代码实现时的定义,代码实现稍有不同,感兴趣可去“help.h”中查看。
//实现函数
void DBDX_2022_2(LinkList_n L,int k){
LNode_n *r=L,*p=L;
while(r->next!=L) r=r->next; //找到链表尾指针
for(int i=0;i<k;i++) p=p->next; //找到左移k步后头指针的前驱指针
r->next=L->next; //插入头指针
L->next=p->next;
p->next=L;
}
//测试代码(可直接使用,不用加上文的代码)
#include"../help.h"
/*
题目:设计一个算法,将循环单链表中的每个结点左移k。
出自:2020东北大学软件工程858考研真题第1题
*/
void DBDX_2022_2(LinkList_n L,int k){
LNode_n *r=L,*p=L;
while(r->next!=L) r=r->next; //找到链表尾指针
for(int i=0;i<k;i++) p=p->next; //找到左移k步后头指针的前驱指针
r->next=L->next; //插入头指针
L->next=p->next;
p->next=L;
}
int main(){
for(int i=0;i<3;i++){
printf("\n------------------第%d次测试-----------------\n\n",i+1);
int len;
int *arr=create_arr_n(10,15,&len);
LinkList_n L=create_l_n_cir(arr,len,1);
print_l_n_cir(L);
printf("左移2");
DBDX_2022_2(L,2);
print_l_n_cir(L);
}
}
//测试结果
//[注] 冒号是尾指针进入的位置,也就是循环链表的循环入口,-1为头节点。