循环链表 ——解决约瑟夫环

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

#include <iostream>
using namespace std;

struct Node {
    int data;
    Node* next;
};

Node* create(int n) { // 1 2 3 ……n
    Node* cur, *q, *head; 
    cur = (Node*)malloc(sizeof(Node));
    head = cur;
    cur->data = 1;

    for (int i = 2; i <= n; i++) {
        q = (Node*)malloc(sizeof(Node));
        q->data = i;
        cur->next = q;
        cur = q;
    }
    cur->next = head;
    return head;

}

void printLink(Node* head) {
    if (head == NULL) {
        cout << "空链表" << endl;
        return;
    }
    Node* p = head;
    while (head != NULL) {
        cout << p->data << endl;
        p = p->next;
    }
}

void processLink(Node* head, int k, int m) { //从编号为k(1<=k<=n)的人开始报数,数到m的那个人出列;
    Node* cur = head;
    Node* tmp = cur;
    //找到编号为k的节点
    while (cur->data != k) {
        cur = cur->next;  
    }

    while (cur->next != cur) {
        //找到第m个数
        for (int i = 0; i < m; i++) {
            tmp = cur;
            cur = cur->next;
        }
        cout << cur->data;
        tmp->next = cur->next;
        free(cur);
        cur = tmp->next;        
    }
    cout << cur->data;
    free(cur);


}
//12345 41325
int main() {
    Node *node = create(5);
    processLink(node, 3, 1);
}
    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/u011040361/article/details/45625861
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞