当前位置: 首页 > article >正文

单向循环链表的约瑟夫环问题

编号为1nn个人围成一圈。从编号为1的人开始报数,报到m的人离开。下一个人继续从1开始报数。n-1轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?

typedef struct ListNode
{
    int val;
    struct ListNode* next;
}ListNode;

 

1、创建结点

与链表的创建节点相同。

//创建节点
ListNode* CreateNode(int x)
{
    ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
    if (newnode == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }

    newnode->val = x;
    newnode->next = NULL;
    return newnode;
}

2、创建链表

将节点之间链接成链表,需要注意的是,n个人,其实就化作n个节点,将其连接成一个环形链表。

//连接节点创建链表
ListNode* CreateList(int n)
{
    ListNode* phead, * ptail;
    int i = 1;
    ptail = phead = CreateNode(i++);
    while (i <= n)
    {
        ptail->next = CreateNode(i++);
        ptail = ptail->next;
    }
    //成环
    ptail->next = phead;

    return phead;
}

注意链接到最后,成环需要将尾节点的next指针指向头结点。 

3、处理约瑟夫环问题

创建一个变量i用于记录节点的位置,创建cur指针遍历这个环形链表,当 i != m 时,继续遍历环形链表;当 i == m 时,我们需要将此时cur指向的节点删除,并链接cur指向节点的前一个节点和后一个节点,进行前述操作需要额外创建一个指针prev指向cur上一个节点进行操作。然后继续处理,直到该环形链表最后只剩下一个节点停止并返回该节点的值。

int JosephRing(int n, int m) {
    ListNode* head = CreateList(n);
    ListNode* cur = head;
    ListNode* prev = NULL;
    int i = 1;
    while (cur->next != cur)
    {
        if (i == m)
        {
            prev->next = cur->next;
            free(cur);
            cur = prev->next;
            i = 1;
        }
        else
        {
            prev = cur;
            cur = cur->next;
            i++;
        }
    }
    return cur->val;
}


http://www.kler.cn/a/487607.html

相关文章:

  • 清理Mac硬盘超大占用:.Spotlight-V100
  • iOS - AutoreleasePool
  • 用python 进行雷电接口检测
  • el-table 多级表头
  • 汽车信息安全 -- S32K1如何更新BOOT_MAC
  • SQL使用视图
  • Vue 3 和 Electron 来构建一个桌面端应用
  • STM32 : 奈奎斯特-香农采样定理
  • JavaScript语言的学习路线
  • ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列
  • c#集成itext7导出pdf,包含表格
  • 基于SpringBoot的中国陕西民俗网的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 阅读笔记——《A survey of protocol fuzzing》
  • RabbitMQ解决消息积压的方法
  • SpringCloud Feign 全局Fallback的另一种实现方式(SpringBoot3.4+)
  • iPad编程新体验:如何用IDE Code App实现远程在线开发告别电脑束缚
  • 大纲笔记幕布的替换
  • 基于伪分布式模式和完全分布式模式部署ZooKeeper集群
  • C# 值类型和引用类型详解
  • Delphi+SQL Server实现的(GUI)户籍管理系统
  • 数据结构-线性表的概念与C语言实现
  • VSCode 插件
  • 使用强化学习训练神经网络玩俄罗斯方块
  • 在 Ubuntu 22.04 上从 Wayland 切换到 X11
  • 定时器类QTimer的简单使用
  • 如何在 Ubuntu 22.04 上部署 BorgBackup 并实现自动化备份教程