C++单向加双向循环链表实现约瑟夫问题

这篇博客探讨了约瑟夫问题的解决方案,通过使用C++实现单向和双向循环链表。文章首先介绍了问题背景,然后详细阐述如何构建循环链表,包括创建、删除节点的操作。作者分别用面向过程的方法实现了两种链表解法,并讨论了游戏的结束条件。最后,作者提出了将部分代码模块化的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        数据结构课堂老师布置了一道题目,就是传说中大名鼎鼎的约瑟夫问题,在此描述一遍:

nn个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过k−2k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k−1k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。

问题是,给定了nnkk,一开始要站在什么地方才能避免被处决?--(来自维基大典)

        题目提示得有点明显,圆圈-->循环链表,那么到底要怎样写循环链表呢,每个结点应该如何?需要哪些函数?

        毫无疑问,先站成一个圈,那就是创建循环链表,越过k-1个人以后杀掉第k个人,那就得有删除结点的功能,然后,,也没啥特别的了,只要确定游戏终止规则——即循环结束的条件是还剩最后一人,把那个人的信息输出来就知道一开始应该在哪个位置能活命。

        本文将围绕这个问题给出单双链表的解法,先用双向循环链表的思想,纯粹面向过程的方法,再用单向循环链表的方法面向过程地实现一遍,然后再把一些模块封装成函数,使程序模块化。

   双向循环链表思想解法

//
// Created by zhuge on 2018/3/11.
//
#include <iostream>
using namespace s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值