SZUOJ - 约瑟夫环 —— 循环链表

一、题面

SZUOJ - 约瑟夫环 —— 循环链表

 

二、题解 

使用无头结点的循环链表

 

三、实现代码

#include <iostream>

using namespace std;

class Node{
public:
    int data;
    Node* next;
    Node(){
        next=NULL;
    }
};

class Joseph{
    Node* root;
    int n;
    int k;
    int s;
public:
    Joseph(int _n,int _k,int _s){
        int i;
        Node* p;
        Node* q;
        root=new Node;
        root->data=1;
        q=root;
        //cin>>n>>k>>s;
        n=_n;
        s=_s;
        k=_k;
        for(i=2;i<=n;i++){
            p=new Node;
            p->data = i;
            q->next=p;
            q=p;
        }
        q->next=root;
    }

    void Count(){
        int i,val;
        Node *p,*q,*sp;
        p=root;
        for(i=1;i<s;i++){
            sp=p;
            p=p->next;
        }
        while(1){
            if(p->next == p) break;
            for(i=1;i<k;i++){
                sp=p;
                val=p->data;
                p=p->next;
            }
            cout<<p->data<<" ";
            sp->next=p->next;
            p=p->next;
        }
        cout<<p->data<<" "<<endl;
    }
};

int main(){
    int n,k,s;
    while(cin>>n>>k>>s){
        Joseph J(n,k,s);
        J.Count();
    }
    return 0;
}