<!DOCTYPE unspecified PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title>php--循环单链表的实现,解决约瑟夫丢手帕问题</title></head>
<body>
<?php
class Child{
public $no;
public $next;
public function __construct($no=''){
$this->no=$no;
$this->next=null;
}
}
function addChild(&$first,$n){
$cur=null;
for ($i=0;$i<$n;$i++){
$child=new Child($i+1);
if($i==0){
$first=$child;
$first->next=$child;
$cur=$first;}
else{
$cur->next=$child;
$child->next=$first;
$cur=$cur->next;
}
}
}
function showChild($first){
$cur=$first;
while($cur->next!=$first){
echo '小孩的编号为'.$cur->no.'</br>';
$cur=$cur->next;
}
echo '<br/>小孩的编号为'.$cur->no.'</br>';
}
function countChild($first,$m,$k){
$tail=$first;
//首先让$tail指向最后一个
// while($tail->next!=$first){
// $tail=$tail->next;
// }
//考虑是从第几个人开始数数
//第k个人开始数
for($i=0;$i<$k-1;$i++){
// $tail=$tail->next;
$first=$first->next;
}
while($tail!=$first){
//当$tail==$first则说明只有最后一个人了.
for($i=0;$i<$m-1;$i++){
$tail=$tail->next;
$first=$first->next;
}
echo '<br/>出圈额人的编号是'.$first->no;
//把$first指向的节点小孩删除环形链表
$first=$first->next;
$tail->next=$first;
}
echo '<br/>最后留在圈圈的人的编号是'.$tail->no;
}
$first=null;
$n=5;
addChild(&$first,$n);
showChild($first);
countChild($first,3,2);
转载于:https://my.oschina.net/mojiadan/blog/113903