PHP模擬單鏈表的數據結構

<?php

/***
 * 單鏈表
 */

//節點,下標,節點名稱,下一個節點的地址
class Node
{
    public $id;
    public $name;
    public $next;

    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
        $this->next = null;
    }
}

class SingleLinkList
{
    private $header;
    public function __construct($id=null,$name=null)
    {
        $this->header=new Node($id,$name);
    }

    /**
     * 獲取單鏈表的長度
     */
    public function getLinkLength(){
        $i = 0;
        $current = $this->header;
        while($current->next !=null){
            $i++;
            $current = $current->next;
        }
        return $i;
    }

    /**
     * 添加節點到單鏈表中(原理就是插入當前的節點的位置存儲的下一個節點的信息,上一個節點存儲當前節點的信息)
     * @param $node 節點
     */
    public function addLink($node){
        $current = $this->header;
        while($current->next!=null){
            if($current->next->id > $node->id){
                break;
            }
            $current = $current->next;
        }
        $node->next = $current->next;
        $current->next = $node;
    }

    /**
     * 刪除節點(刪除的節點的下一個位置保持在上一個節點中)
     * @param $id
     */
    public function delLink($id){
        $current = $this->header;
        $flag = false;
        while($current->next!=null){
            if($current->next->id == $id){
                $flag = true;
                break;
            }
            $current = $current->next;
        }

        if($flag){
            //說明找到了節點
            $current->next = $current->next->next;
        }else{
            echo '未找到該節點'.$id.'的信息';
        }
    }

    /**
     * 判斷單鏈表是否爲空
     * @return bool
     */
    public function isEmpty(){
        return $this->header == null;
    }

    /**
     * 清空單鏈表
     */
    public function clear(){
        $this->header=null;
    }

    /**
     * 獲取鏈表的信息
     */
    public function getLinkList(){
        $current = $this->header;
        if($current->next==null){
            echo '鏈表爲空';
            return;
        }
        while($current->next != null){
            echo 'id:'.$current->next->id.',節點名稱爲'.$current->next->name.'<br/>';
            if($current->next->next == null){
                break;
            }
            $current=$current->next;
        }
    }

    /**
     * 獲取某個節點信息
     * @param $id
     * @return string
     */
    public function getLinkNameById($id){
        $current = $this->header;
        if($current->next==null){
            return '';
        }

        while($current->next != null){
            if($current->id == $id){
                return $current->name;
            }
            $current=$current->next;
        }
    }

    /**
     * 更新某個節點名稱
     * @param $id
     * @param $name
     */
    public function updateLink($id,$name){
        $current = $this->header;
        if($current->next==null){
            return '';
        }

        while($current->next != null){
            if($current->id == $id){
                return $current->name=$name;
            }
            $current=$current->next;
        }
    }
}

header('Content-Type:text/html;charset=utf8');
$lists = new SingleLinkList();

$lists->addLink ( new node ( 5, 'eeeeee' ) );
$lists->addLink ( new node ( 1, 'aaaaaa' ) );
$lists->addLink ( new node ( 6, 'ffffff' ) );
$lists->addLink ( new node ( 4, 'dddddd' ) );
$lists->addLink ( new node ( 3, 'cccccc' ) );
$lists->addLink ( new node ( 2, 'bbbbbb' ) );
$lists->getLinkList ();
echo "<br>-----------刪除節點--------------<br>";
$lists->delLink ( 5 );
$lists->getLinkList ();
echo "<br>-----------更新節點名稱--------------<br>";
$lists->updateLink ( 3, "222222" );
$lists->getLinkList ();
echo "<br>-----------獲取節點名稱--------------<br>";
echo $lists->getLinkNameById ( 5 );
echo $lists->getLinkNameById ( 4 );
echo "<br>-----------獲取鏈表長度--------------<br>";
echo $lists->getLinkLength ();
相關文章
相關標籤/搜索