约瑟夫环 单向循环链表实现

约瑟夫环 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

///循环链表实现
#include<bits/stdc++.h>
using namespace std;
typedef struct List
{
    int data;
    struct List *next;
} node;
int main()
{
    node *head,*r,*s;
    head = new node;///带来头结点,不过后面会去掉
    r =head;
    int n,i;
    int k;
       cin>>n>>k;
       ///建立循环链表
        for(i = 1; i<=n; i++)
        {
            s = new node;
            s->data = i;
            r->next = s;
            r= s;
        }
        r->next =head->next;///为节点指向头结点的下一个有数据的结点
        node *p,*p1;
        p = head->next;///去掉头结点
        delete head;
        while(p->next != p)///当链表中只有一个结点时停止
        {
            for(i = 1; i<k-1; i++)///遍历到第k个时停止
            {
                p = p->next;
            }
            p1=p->next;///删除该结点
            p->next = p->next->next;
            delete p1;
            p = p->next;
        }
        cout<<p->data<<endl;
        delete p;
     return 0;
}

猜你喜欢

转载自www.cnblogs.com/tp25959/p/10254101.html