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 相关文章推荐
javascript之卸载鼠标事件的代码
May 14 Javascript
javascript中最常用的继承模式 组合继承
Aug 12 Javascript
jQuery数组处理方法汇总
Jun 20 Javascript
jquery重复提交请求的原因浅析
May 23 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
Jul 02 Javascript
百度地图自定义控件分享
Mar 04 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
浅析jQuery Mobile的初始化事件
Dec 03 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
Sep 27 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
Oct 27 Javascript
详解JavaScript 中 if / if...else...替换方式
Jul 15 Javascript
函数四种调用模式以及其中的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
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
简单实现PHP留言板功能
2016/12/21 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
js 目录列举函数
2008/11/06 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
Python的requests网络编程包使用教程
2016/07/11 Python
深入理解Python对Json的解析
2017/02/14 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
博士学位自我鉴定范文
2013/12/26 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
导游词300字
2015/02/13 职场文书
2015年检验科工作总结
2015/04/27 职场文书