PHP如何实现环形链表解决约瑟夫环问题案例?
- 内容介绍
- 文章标签
- 相关推荐
本文共计870个文字,预计阅读时间需要4分钟。
原文示例:本文字例讲述了PHP基于环形链表解决约瑟夫环问题的方法。分享给家长供参考,具体如下:
首先重温约瑟夫环问题:N个人围成一圈,从第一个人开始报数,报到M的人出列,然后从下一个人开始继续报数,直到最后剩下一个人。
接下来,我们使用PHP实现这个算法。具体步骤如下:
1. 创建一个环形链表,包含N个节点,每个节点存储一个人的信息。
2.遍历链表,每次找到第M个人并将其移除。
3.重复步骤2,直到链表中只剩下一个节点。
以下是PHP代码实现:
php
class Node { public $data; public $next;public function __construct($data) { $this->data=$data; $this->next=null; }}
function josephusCircle($n, $m) { $head=new Node(1); $current=$head; for ($i=2; $i next=new Node($i); $current=$current->next; } $current->next=$head; // 创建环形链表
$current=$head; while ($current->next !=$current) { for ($count=1; $count next; } $prev->next=$current->next; // 移除第M个人 echo 出列的人是:{$current->data}\n; $current=$current->next; } echo 最后剩下的人是:{$current->data}\n;}
// 测试代码josephusCircle(10, 3);
运行上述代码,输出结果如下:
出列的人是:3出列的人是:6出列的人是:9出列的人是:2出列的人是:5出列的人是:8出列的人是:1出列的人是:4出列的人是:7最后剩下的人是:10
本文实例讲述了php基于环形链表解决约瑟夫环问题。分享给大家供大家参考,具体如下:
先来重温一下约瑟夫环问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
前面介绍了关联数组解决约瑟夫环的方法,环形链表解决约瑟夫环的方法如下:
<?php header("content-type:text/html;charset=utf-8"); class Child{ public $no; public $next=null; public function __construct($no){ $this->no=$no; } } function addChild($n,&$first){ //$n是人的个数,创建环形链表 for($i=0;$i<$n;$i++){ $child=new Child($i+1); if($i==0){ $first=$child; $cur=$child; $cur->next=$cur; }else{ $cur->next=$child; $child->next=$first; $cur=$cur->next; } } } function showHero($first){ $cur=$first; while($cur->next!=$first){ echo "<br/>人的编号:".$cur->no; $cur=$cur->next; } echo "<br/>人的编号:".$cur->no; } function countChild($first,$m,$k){ $cur=$first; for($i=0;$i<$m-1;$i++){ $cur=$cur->next; } $j=0; while($cur!=$cur->next){ if($j==$k-2){ echo "<br/>出列编号:".$cur->next->no; $cur->next=$cur->next->next; $cur=$cur->next; $j=0; }else{ $cur=$cur->next; $j++; } } echo "<br/>最后出列编号:".$cur->no; } addChild(10,$first); showHero($first); echo "<hr/>"; countChild($first,2,3); //第二个人开始数,数到三出列 ?>
运行结果:
人的编号:1 人的编号:2 人的编号:3 人的编号:4 人的编号:5 人的编号:6 人的编号:7 人的编号:8 人的编号:9 人的编号:10 -------------------------------------------------------------------------------- 出列编号:4 出列编号:7 出列编号:10 出列编号:3 出列编号:8 出列编号:2 出列编号:9 出列编号:6 出列编号:1 最后出列编号:5
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》
希望本文所述对大家PHP程序设计有所帮助。
本文共计870个文字,预计阅读时间需要4分钟。
原文示例:本文字例讲述了PHP基于环形链表解决约瑟夫环问题的方法。分享给家长供参考,具体如下:
首先重温约瑟夫环问题:N个人围成一圈,从第一个人开始报数,报到M的人出列,然后从下一个人开始继续报数,直到最后剩下一个人。
接下来,我们使用PHP实现这个算法。具体步骤如下:
1. 创建一个环形链表,包含N个节点,每个节点存储一个人的信息。
2.遍历链表,每次找到第M个人并将其移除。
3.重复步骤2,直到链表中只剩下一个节点。
以下是PHP代码实现:
php
class Node { public $data; public $next;public function __construct($data) { $this->data=$data; $this->next=null; }}
function josephusCircle($n, $m) { $head=new Node(1); $current=$head; for ($i=2; $i next=new Node($i); $current=$current->next; } $current->next=$head; // 创建环形链表
$current=$head; while ($current->next !=$current) { for ($count=1; $count next; } $prev->next=$current->next; // 移除第M个人 echo 出列的人是:{$current->data}\n; $current=$current->next; } echo 最后剩下的人是:{$current->data}\n;}
// 测试代码josephusCircle(10, 3);
运行上述代码,输出结果如下:
出列的人是:3出列的人是:6出列的人是:9出列的人是:2出列的人是:5出列的人是:8出列的人是:1出列的人是:4出列的人是:7最后剩下的人是:10
本文实例讲述了php基于环形链表解决约瑟夫环问题。分享给大家供大家参考,具体如下:
先来重温一下约瑟夫环问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
前面介绍了关联数组解决约瑟夫环的方法,环形链表解决约瑟夫环的方法如下:
<?php header("content-type:text/html;charset=utf-8"); class Child{ public $no; public $next=null; public function __construct($no){ $this->no=$no; } } function addChild($n,&$first){ //$n是人的个数,创建环形链表 for($i=0;$i<$n;$i++){ $child=new Child($i+1); if($i==0){ $first=$child; $cur=$child; $cur->next=$cur; }else{ $cur->next=$child; $child->next=$first; $cur=$cur->next; } } } function showHero($first){ $cur=$first; while($cur->next!=$first){ echo "<br/>人的编号:".$cur->no; $cur=$cur->next; } echo "<br/>人的编号:".$cur->no; } function countChild($first,$m,$k){ $cur=$first; for($i=0;$i<$m-1;$i++){ $cur=$cur->next; } $j=0; while($cur!=$cur->next){ if($j==$k-2){ echo "<br/>出列编号:".$cur->next->no; $cur->next=$cur->next->next; $cur=$cur->next; $j=0; }else{ $cur=$cur->next; $j++; } } echo "<br/>最后出列编号:".$cur->no; } addChild(10,$first); showHero($first); echo "<hr/>"; countChild($first,2,3); //第二个人开始数,数到三出列 ?>
运行结果:
人的编号:1 人的编号:2 人的编号:3 人的编号:4 人的编号:5 人的编号:6 人的编号:7 人的编号:8 人的编号:9 人的编号:10 -------------------------------------------------------------------------------- 出列编号:4 出列编号:7 出列编号:10 出列编号:3 出列编号:8 出列编号:2 出列编号:9 出列编号:6 出列编号:1 最后出列编号:5
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》
希望本文所述对大家PHP程序设计有所帮助。

