PHP · 2016/03/25 0

PHP之实现双向链表(代码篇)

<?php
/**
 * PHP之实现双向链表
 */
class Hero{

    public $pre=null;
    public $no;
    public $name;
    public $next=null;

    public function __construct($no='',$name=''){
        $this->no=$no;
        $this->name=$name;
    }

    static public function addHero($head,$hero){
        $isExist=false;
        //判断目前这个链表是否为空
        if($head->next==null){
            $head->next=$hero;
            $hero->pre=$head;
        }else{
            //如果不是空链表,则按排名来添加
            //找到添加的位置
            while($head->next!=null){
                if($head->next->no > $hero->no){
                    break;
                }elseif($head->next->no == $hero->no){
                    $isExist=true;
                    echo "<br>不能添加相同的编号";
                }else{
                    $head=$head->next;  
                }
            }
            if(!$isExist){
                if($head->next!=null){
                    $hero->next=$head->next;
                    $hero->next->pre=$hero;
                }
                $hero->pre=$head;
                $head->next=$hero;                   
            }
        }
    }

    //遍历
    static public function showHero($head){
        while($head->next!=null){
            echo "<br>编号:".$head->next->no."名字:".$head->next->name;
            $head=$head->next;
        }
    }

    static public function delHero($head,$herono){
        $isFind=false;
        while($head!=null){
            if($head->no==$herono){
                $isFind=true;
                break;
            }
            //继续找
            $head=$head->next;
        }
        if($isFind){
            if($head->next!=null){
                $head->next->pre=$head->pre;
            }
            $head->pre->next=$head->next;
        }else{
            echo "<br>没有找到目标";
        }               
    }
}

$head  = new Hero();
$hero1 = new Hero(1,'1111');
$hero3 = new Hero(3,'3333');
$hero2 = new Hero(2,'2222');

Hero::addHero($head,$hero1);
Hero::addHero($head,$hero3);
Hero::addHero($head,$hero2);
Hero::showHero($head);

Hero::delHero($head,2);
Hero::showHero($head);