用PHP实现的单链表

单链表顾名思义就是一个链式数据结构,它有一个表头,并且除了最后一个节点外,所有节点都有其后继节点。如下图。

首先,我们写出链表节点的类。单链表中的每一个节点,都保存其数据域和后驱指针

//链表节点   
class node {   
    public $id; //节点id   
    public $name; //节点名称   
    public $next; //下一节点   
     
    public function __construct($id, $name) {   
        $this->id = $id;   
        $this->name = $name;   
        $this->next = null;   
    }   
}  

链表中还有两个特别重要的方法,插入和删除。插入需要找到插入的位置,把前一个元素的next指针指向被插入的节点,并将被插入节点的next指针指向后一个节点,如下图左侧所示。而删除则是把前一个节点的next指针指向后一个节点,并返回被删除元素的数据内容,如下图右侧所示。
 

//单链表   
class singelLinkList {   
    private $header; //链表头节点   
     
    //构造方法   
    public function __construct($id = null, $name = null) {   
        $this->header = new node ( $id, $name, null );   
    }   
  
    //获取链表长度   
    public function getLinkLength() {   
        $i = 0;   
        $current = $this->header;   
        while ( $current->next != null ) {   
            $i ++;   
            $current = $current->next;   
        }   
        return $i;   
    }   
  
    //添加节点数据   
    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;   
    }   
  
    //删除链表节点   
    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=" . $id . "的节点!<br>";   
        }   
    }  
  
    //判断连表是否为空  
    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 . '   name:' . $current->next->name . "<br>";   
            if ($current->next->next == null) {   
                break;   
            }   
            $current = $current->next;   
        }   
    }   
  
    //获取节点名字   
    public function getLinkNameById($id) {   
        $current = $this->header;   
        if ($current->next == null) {   
            echo "链表为空!";   
            return;   
        }   
        while ( $current->next != null ) {   
            if ($current->id == $id) {   
                break;   
            }   
            $current = $current->next;   
        }   
        return $current->name;   
    }   
  
    //更新节点名称   
    public function updateLink($id, $name) {   
        $current = $this->header;   
        if ($current->next == null) {   
            echo "链表为空!";   
            return;   
        }   
        while ( $current->next != null ) {   
            if ($current->id == $id) {   
                break;   
            }   
            $current = $current->next;   
        }   
        return $current->name = $name;   
    }   
}  
$lists = new singelLinkList ();   
$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 "<br>-----------获取链表长度--------------<br>";   
echo $lists->getLinkLength ();  

 

转载于:https://my.oschina.net/u/2898364/blog/848477

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值