javascript循环链表之约瑟夫环的实现方法
发布时间 - 2026-01-10 22:33:52 点击率:次前言

传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围。犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案。他们围成一个圈,从一个人开始,数到第三个人时将第三个人杀死,然后再数,直到杀光所有人。约瑟夫和另外一个人决定不参加这个疯狂的游戏,他们快速地计算出了两个位置,站在那里得以幸存。写一段程序将n 个人围成一圈,并且第m个人会被杀掉,计算一圈人中哪两个人最后会存活。使用循环链表解决该问题。
看到这个问题首先想到的是要用到循环链表,还有就是要计算链表中有多少个元素,这两点很重要。再有就是找到当前节点和在链表中向前移动m个节点。下面一一分析:循环链表很容易实现,就是初始化的时候使链表的头节点的下一个指向它自己,这样初始化一个空节点,注意链表的头不是节点。写法如下:this.head.next = this.head;计算链表中有多少个元素也很简单,只需要找到头节点,然后往下走直到再次回到头结点
代码如下:
var node = this.head;
var i = 0;
while (!(node.next.element == "head")){
node = node.next;
i++;
}
return i;
在初始化链表的时候我们定义一个当前节点,将它赋值为头节点this.currentNode = this.head; ,这样在移动节点的时候就可以用它指向下一个节点。向前移动节点的时候有个地方需要注意,如果当前移动到头节点上需要再向前移动一个节点this.currentNode.next.next 。
代码如下:
while (n>0){
if(this.currentNode.next.element == "head"){
this.currentNode = this.currentNode.next.next;
}else{
this.currentNode = this.currentNode.next;
}
n--;
}
代码实现
/**
* 使用循环链表实现解决约瑟夫环问题
* */
//链表节点
function Node(element){
this.element = element;
this.next = null;
}
//定义链表类
function LList(){
this.head = new Node("head");
this.head.next = this.head;
this.find = find;
this.insert = insert;
this.findPrevious = findPrevious;
this.remove = remove;
this.currentNode = this.head;
//从链表当前节点向前移动n个节点
this.advance = advance;
//当前链表中有多少个元素
this.count = count;
this.display = display;
}
//查找节点
function find(item){
var currNode = this.head;
while (currNode.element != item){
currNode = currNode.next;
}
return currNode;
}
//插入新节点
function insert(newElement, item){
var newNode = new Node(newElement);
var current = this.find(item);
newNode.next = current.next;
current.next = newNode;
}
//查找当前节点的上一个节点
function findPrevious(item){
var currNode = this.head;
while (!(currNode.next == null) && (currNode.next.element != item)){
currNode = currNode.next;
}
return currNode;
}
//移除当前节点
function remove(item){
var prevNode = this.findPrevious(item);
if(!(prevNode.next == null)){
prevNode.next = prevNode.next.next;
}
}
//向前移动n个节点
function advance(n){
while (n>0){
if(this.currentNode.next.element == "head"){
this.currentNode = this.currentNode.next.next;
}else{
this.currentNode = this.currentNode.next;
}
n--;
}
}
//当前链表中有多少个元素
function count(){
var node = this.head;
var i = 0;
while (!(node.next.element == "head")){
node = node.next;
i++;
}
return i;
}
//输出所有节点
function display(){
var currNode = this.head;
while (!(currNode.next == null) && !(currNode.next.element == "head")){
document.write(currNode.next.element + " ");
currNode = currNode.next;
}
}
var person = new LList();
person.insert('1','head');
person.insert('2', '1');
person.insert('3', '2');
person.insert('4' , '3');
person.insert('5' , '4');
person.insert('6' , '5');
person.insert('7' , '6');
person.insert('8' , '7');
person.insert('9' , '8');
person.insert('10' , '9');
person.display();
document.write('<br>');
var n = 3;
while (person.count() > 2){
person.advance(n);
person.remove(person.currentNode.element);
person.display();
document.write('<br>');
}
这里我们假设有10个人,每次数到第三个人的时候这个人自杀,最后输出的结果如下:
最后结果是约瑟夫和他的同伴一个站在队伍的第4个,一个站在队伍的第10个,最后只剩下他们两个人。不知道历史上有没有这件事,如果真的有这件事,在这么短的时间内解决这个问题,约瑟夫真他么是个天才,不知道当时他有没有用指针来解决这个问题,还是用普通的数组递归解决。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# 约瑟夫环
# js约瑟夫环
# 一个报数游戏js版(约瑟夫环问题)
# JavaScript三种方法解决约瑟夫环问题的方法
# 链表
# 约瑟夫
# 中有
# 犹太
# 站在
# 多少个
# 出了
# 这件事
# 递归
# 解决这个问题
# 围成
# 的是
# 数到
# 是个
# 有个
# 罗马
# 只需
# 上有
# 这个问题
# 很容易
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何在景安云服务器上绑定域名并配置虚拟主机?
EditPlus中的正则表达式 实战(1)
桂林网站制作公司有哪些,桂林马拉松怎么报名?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
html5的keygen标签为什么废弃_替代方案说明【解答】
java ZXing生成二维码及条码实例分享
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
如何制作一个表白网站视频,关于勇敢表白的小标题?
制作公司内部网站有哪些,内网如何建网站?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
昵图网官网入口 昵图网素材平台官方入口
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
Python并发异常传播_错误处理解析【教程】
简单实现Android文件上传
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
Laravel如何实现用户注册和登录?(Auth脚手架指南)
网站制作壁纸教程视频,电脑壁纸网站?
如何确保FTP站点访问权限与数据传输安全?
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
如何用腾讯建站主机快速创建免费网站?
linux top下的 minerd 木马清除方法
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何快速生成高效建站系统源代码?
大型企业网站制作流程,做网站需要注册公司吗?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel如何使用模型观察者?(Observer代码示例)
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
如何安全更换建站之星模板并保留数据?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
iOS中将个别页面强制横屏其他页面竖屏
Linux后台任务运行方法_nohup与&使用技巧【技巧】
Laravel如何配置和使用缓存?(Redis代码示例)
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
如何快速查询域名建站关键信息?
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
重庆市网站制作公司,重庆招聘网站哪个好?
如何在Windows服务器上快速搭建网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面

