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.'
'; 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 "
-----------删除节点--------------
"; $lists->delLink ( 5 ); $lists->getLinkList (); echo "
-----------更新节点名称--------------
"; $lists->updateLink ( 3, "222222" ); $lists->getLinkList (); echo "
-----------获取节点名称--------------
"; echo $lists->getLinkNameById ( 5 ); echo $lists->getLinkNameById ( 4 ); echo "
-----------获取链表长度--------------
"; echo $lists->getLinkLength ();