php--循环单链表的实现,解决约瑟夫丢手帕问题

<!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);

你可能感兴趣的:(PHP循环单链表)