Javascript循环列表的约瑟夫环的实现 浏览:905

前言

在第一世纪的犹太战争,犹太历史学家Flavio Josephs和他的40个同胞被包围的罗马士兵。犹太士兵决定宁愿自杀,而不是一个囚犯,所以他同意自杀计划。他们围成一个圈,从一个人开始,人就数到第三第三人被杀,然后再次,直到杀了所有的人。约瑟夫和其他人决定不参加这个疯狂的游戏,他们迅速地计算两个位置,站在那里生存。写一个程序来圈的n个人,和我个人会被杀死,这两人将最终生存下来。用循环链表解决问题。

首先要思考的是一个循环链表的使用,和计算列表中的元素的数量的重要性。另一个是找到当前节点和移动节点的链表中M前进。以下分析:循环链表是容易实现的,即当初始化,使链的下一个节点的下一个点,以初始化一个空节点,并注意到链表的头是不是一个节点。写的方法如下:this.head.next = this.head;计算链接列表中的元素的个数也很简单,只需要找到头节点,然后下去直到我们回到头节点再次。

代码如下:


var node = this.head;
var I=0;
(当!(node.next.element = =头)){
节点= node.next;
++;
}
还我;


初始化链表时,我们定义了一个当前节点和分配给表头节点this.currentnode = this.head,所以当我们移动的节点,我们可以用它来指向下一个节点。前进时的节点,有一个需要注意的是,如果当前移动的头节点,我们需要前进一个节点this.currentnode.next.next。

代码如下:


而(n>0){
如果(this.currentnode.next.element = =头){
this.currentnode = this.currentnode.next.next;
其他{ }
this.currentnode = this.currentnode.next;
}
n;
}


代码实现



用循环链表解决约瑟夫环问题
**

列出节点
函数节点(元素){
this.element =元;
this.next = null;
}

/ /定义列表
功能LList(){
this.head =新的节点(头);
this.head.next = this.head;
this.find =找到;
this.insert =插入;
this.findprevious = findprevious;
this.remove =删除;
this.currentnode = this.head;
从当前节点列表转发节点n
this.advance =进步;
当前列表中有多少个元素
this.count =计数;
this.display =显示;
}

找到一个节点
函数查找(项目){
无功currnode = this.head;
而(currnode.element!=项目){
currnode = currnode.next;
}
返回currnode;
}

插入新节点
函数插入(新元素,项){
无功节点=新的节点(空间);
无功电流= this.find(项目);
NewNode.next = current.next;
current.next =节点;
}

在当前节点的一个节点上查找
功能findprevious(项){
无功currnode = this.head;
(当!(currnode.next = null)(currnode.next.element!=项目){)
currnode = currnode.next;
}
返回currnode;
}

删除当前节点
函数删除(项目){
无功prevnode = this.findprevious(项目);
(如果!(prevnode.next = = null){)
prevnode.next = prevnode.next.next;
}
}

移动前/ n / n节点
函数前进(n){
而(n>0){
如果(this.currentnode.next.element = =头){
this.currentnode = this.currentnode.next.next;
其他{ }
this.currentnode = this.currentnode.next;
}
n;
}
}

当前列表中有多少个元素
函数计数(){
var node = this.head;
var I=0;
(当!(node.next.element = =头)){
节点= node.next;
++;
}
还我;
}

输出所有节点
函数显示(){
无功currnode = this.head;
而((currnode.next = = null)!!(currnode.next.element = =头)){
document.write(currnode.next.element + );
currnode = currnode.next;
}
}

无功的人=新LList();
Person.insert ('1','head');
Person.insert(2,1);
Person.insert(3,2);
Person.insert(4',3');
Person.insert(5','');
Person.insert(6,5');
Person.insert(7',6');
Person.insert(8',7');
Person.insert(9、8);
Person.insert(10,9);


Person.display();
document.write('');


var = 3;
而(person.count()> 2){
person.advance(N);
person.remove(人。CurrentNode。元);
Person.display();
document.write('');
}


在这里我们假设有10人,每次有第三人,自杀者,最终产出如下:

最后的结果是约瑟夫和他的同伴在队中排名第四,一个是队伍中的第十个,最后只有两个。我不知道历史上是否有这样的事情。如果有这样的事,在这么短的时间内解决这个问题,约瑟夫真是个天才。他不知道他是用指针来解决问题还是用普通数组递归地解决问题。

总结

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一定的帮助。如果有任何疑问,你可以留言。
推荐文章1
广告