循环单链表解决循环报数问题

    技术2022-07-10  115

    循环单链表解决循环报数问题

    上海银行总行科技岗暑期实习生编程题目

    有n(n>1)个人围成一圈循环报数,每次报到3就出列,剩下的人继续从1开始报数,直至只剩一个人,求剩下那一个人的原始编号。

    #include<iostream> using namespace std; typedef struct node { int data; struct node* next; }Linklist; void baoshu(int m) { Linklist *L,*s,*r,*p; L = (Linklist*)malloc(sizeof(Linklist)); L->next = L; //创建一个循环单链表的头节点 L->data = 1; //头节点也要存数据,此时循环单链表非空 r = L; //r指向尾节点,尾插法建表,同时可用于记录要删除节点的前趋节点 for(int i = 2;i<=m;i++) { s = (Linklist*)malloc(sizeof(Linklist)); s->data = i; r->next = s; r = s; //尾插法创建循环单链表,原始编号作为数据存入 } r->next = L; //尾节点指向头节点 p = r->next; //与r作为指针对配合使用,找到p时,方便利用p的前趋节点r进行删除 int k =1; //记录报数 while(m>1) //人数大于1时循环报数,直至只剩一人 { if(k!=3) { k++; r = p; p = p->next; } else //报到3时释放p节点 { k=1; r->next = p->next; free(p); m--; p = r->next; } } return (r->data); //r始终指向被删除节点的前趋节点,最后只剩一人时,r就指向最后一人,输出其原始编号 }; int main(){ int n; cin>>n; cout<<baoshu(n); }
    Processed: 0.014, SQL: 9