PHP如何实现环形链表解决约瑟夫环问题案例?

更新于
2026-09-30 12:15:15
1阅读来源:SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计870个文字,预计阅读时间需要4分钟。

PHP如何实现环形链表解决约瑟夫环问题案例?

原文示例:本文字例讲述了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如何实现环形链表解决约瑟夫环问题案例?

本文实例讲述了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如何实现环形链表解决约瑟夫环问题案例?

原文示例:本文字例讲述了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如何实现环形链表解决约瑟夫环问题案例?

本文实例讲述了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程序设计有所帮助。