javascript循环链表之约瑟夫环的实现方法


Posted in Javascript onJanuary 16, 2017

前言

传说在公元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个,最后只剩下他们两个人。不知道历史上有没有这件事,如果真的有这件事,在这么短的时间内解决这个问题,约瑟夫真他么是个天才,不知道当时他有没有用指针来解决这个问题,还是用普通的数组递归解决。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
脚本安需导入(装载)的三种模式的对比
Jun 24 Javascript
写了一个layout,拖动条连贯,内容区可为iframe
Aug 19 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
Nov 11 Javascript
js 调用父窗口的具体实现代码
Jul 15 Javascript
jquery判断元素的子元素是否存在的示例代码
Feb 04 Javascript
JavaScript实现常用二级省市级联下拉列表的方法
Mar 25 Javascript
js中获取时间new Date()的全面介绍
Jun 20 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
Nov 07 Javascript
angular 动态组件类型详解(四种组件类型)
Feb 22 Javascript
jQuery表单验证之密码确认
May 22 jQuery
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
Jan 27 Vue.js
函数四种调用模式以及其中的this指向
Jan 16 #Javascript
js实现导航栏中英文切换效果
Jan 16 #Javascript
Bootstrap面板使用方法
Jan 16 #Javascript
codeMirror插件使用讲解
Jan 16 #Javascript
微信小程序 图片边框解决方法
Jan 16 #Javascript
微信小程序 scroll-view隐藏滚动条详解
Jan 16 #Javascript
微信小程序 video详解及简单实例
Jan 16 #Javascript
You might like
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
js正确获取元素样式详解
2009/08/07 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
webpack-mvc 传统多页面组件化开发详解
2019/05/07 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
python中enumerate的用法实例解析
2014/08/18 Python
python实现的简单猜数字游戏
2015/04/04 Python
python函数局部变量用法实例分析
2015/08/04 Python
Python3字符串学习教程
2015/08/20 Python
Python设计模式之抽象工厂模式
2016/08/25 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
python实现简单文件读写函数
2021/02/25 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
《木笛》教学反思
2014/03/01 职场文书
安全员岗位职责范本
2015/04/11 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL