//环型链表 数据结构
class CircleLink{
public $number;
public $next=null;
public function __construct($number){
$this->number=$number;
}
}
//添加对象
function addCircle($n){
$cur=null;
$first=null;
for($i=1;$i<=$n;$i++){
$child=new CircleLink($i);
//说明是第一个对象
if($i==1){
$first=$child;
$first->next=$first;//这里为什么要写这句呢,大家想想,如果不写这句话,
//如果只创建一个对象,怎么办,那么他就不是环型链表了,所以写这句话,就是你创建一个
//对象也是环型链表,我让他自己指向自己,这样也是一个圆环呀,其实也可以不写的。
$cur=$child;
}else{
$cur->next=$child;
$child->next=$first;
$cur=$cur->next;
}
}
return $first;
}
//查看环型链表
function showCircle($first){
$cur=$first;//这里使用了一个巧妙的方法,把first再赋值给一个临时对象
while($cur->next!=$first){
echo $cur->number."《br /》";
$cur=$cur->next;
}
echo $cur->number;
}
function countCircle($first,$m=1,$k=2){
$cur=$first;
while($cur->next!=$first){
$cur=$cur->next;
}
for($i=0;$i<$m-1;$i++){
$cur=$cur->next;
$first=$first->next;
}
//退出循环说明,$cur指向是最后一个对象
//循环一个,执行两句代码,即循环一下,数2个数
while($cur!=$first){
for($n=0;$n<$k-1;$n++){
$cur=$cur->next;
$first=$first->next;
}
echo "要出圈的小孩是:".$first->number."《br /》";
$cur->next=$first->next;
$first=$cur->next;
}
echo "最后一个人是:".$cur->number."《br /》";
}
echo "《meta http-equiv='content-Type' content='text/html;charset=utf-8'/》";
$first=null;
$first=addCircle(5);
showCircle($first);
echo "《br /》";
countCircle($first,1,2);
参考文章 http://blog.sina.com.cn/s/blog_bd418dfa0102vmv1.html
网友评论