PHP实现双向链表并排序 -- 会员排名演示
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。如果不清楚概念的请自行百度。
<?php
/**
* 双向链表实现用户排行榜
*
* 仅用于体现思想逻辑,不具备实际参考价值
* @author 疯狂老司机
* @date 2016-07-07
*/
class Rank
{
/**
* @var 指向前一个节点的引用
*/
public $pre = null;
/**
* @var 指向后一个节点的引用
*/
public $next = null;
/**
* @var 用户排行id
*/
public $id;
/**
* @var 用户名称
*/
public $username;
public function __construct($id = '', $username = '')
{
$this->id = $id;
$this->username = $username;
}
/**
* 添加成员节点方法
*
* @access public
* @param obj head 需要添加到的链表
* @param obj rank 添加成员
*/
public static function addRank($head, $rank)
{
$cur = $head; // 需要添加到的链表
$isExist = false; //这是一个标志位
while ($cur->next != null) {
if ($cur->next->id > $rank->id) {
break;
} else if ($cur->next->id == $rank->id) {
$isExist = true;
echo '不能添加相同的id', PHP_EOL;
}
$cur = $cur->next;
}
if (!$isExist) {
if ($cur->next != null) {
$rank->next = $cur->next;
}
$rank->pre = $cur;
if ($cur->next != null) {
$cur->next->pre = $rank;
}
$cur->next = $rank;
}
}
/**
* 删除成员节点方法
* @access public
* @param obj head 链表
* @param obj rankid 用户排行id
*/
public static function delRank($head, $rankid)
{
$cur = $head->next;
$isFind = false; // 标记位
while ($cur != null) {
if ($cur->id == $rankid) {
$isFind = true;
break;
}
$cur = $cur->next;
}
if ($isFind) {
if ($cur->next != null) {
$cur->next->pre = $cur->pre;
}
$cur->pre->next = $cur->next;
echo '要删除的成员id是' . $cur->id, PHP_EOL;
} else {
echo '要删除的成员没有', PHP_EOL;
}
}
/**
* 遍历所有节点并输出显示
* @access public
* @param obj head 链表
*/
public static function showRank($head)
{
$cur = $head->next; // 不打印空节点
while ($cur->next != null) {
echo 'id=' . $cur->id . ' ' . 'username=' . $cur->username, PHP_EOL;
$cur = $cur->next;
}
echo 'id=' . $cur->id . ' ' . 'username=' . $cur->username, PHP_EOL;
}
}
//创建一个初始节点
$head = new Rank();
//创建一个成员
$rank = new Rank(1, '老王');
Rank::addRank($head, $rank);
$rank = new Rank(2, '小明');
Rank::addRank($head, $rank);
$rank = new Rank(6, '大熊');
Rank::addRank($head, $rank);
$rank = new Rank(3, '静香');
Rank::addRank($head, $rank);
$rank = new Rank(56, '孙二娘');
Rank::addRank($head, $rank);
echo '成员排行榜.....', PHP_EOL;
Rank::showRank($head);
echo '删除后的成员排行榜.....', PHP_EOL;
Rank::delRank($head, 3);
Rank::showRank($head);
echo '下面测试删除最前面的和最后面的成员', PHP_EOL;
echo '删除后的成员排行榜.....', PHP_EOL;
Rank::delRank($head, 1);
Rank::showRank($head);
echo '删除后的成员排行榜.....', PHP_EOL;
Rank::delRank($head, 56);
Rank::showRank($head);

浙公网安备 33010602011771号