PHP实现 单链表

<?php
/**
 * Created by PhpStorm.
 * User: BaiMayou
 * Date: 2019/2/23
 * Time: 14:22
 */
/*
* php,java这种面向对象行的语言,需要通过类的方式来定义链表,c,c++则可以直接定义一个链表
* 所以对链表的定义直接影响到对链表的操作,这里采用的是最接近c的链表定义的一种,同时也是大部分面试的算法题中给出的单链表的定义
*/
//单链表的定义
class ListNode{
    public $data = '';//链表的数据域
    public $next = null;//链表的指针域
    public function __construct($val)
    {
        $this->data = $val;
    }
}
/*
* 单链表的操作
* 对于单链表的操作有基本的在末尾增加,删除新节点,统计节点数量,遍历单链表
* 稍复杂的是在指定位置增加,删除,修改等
* 对应的算法有链表的逆转,查环等
* 所以完成这些功能时,即便很细心,但是因为类的原因或者写的不够完善,而产生一些奇怪的错误。例如,头结点,和head到底表示什么这些问题
* 从代码上我们可以看到,$head表示的就是一个的对象,每一个对象的next属性中存放着另一个对象或null,!
* 在理解的时候需要我们抽象为链表的结构,这样更容易理解,而$head表示指针指向的位置,所以指针一开始在链表的第一个节点位置,及头结点;
* $head->next = $a 也就表示在链表中,head节点的next指针域中存放着节点a的地址,对应为结构图就为:!
*
* 有时候还会影响我们对这些数据结构的理解,这也是在写算法中多使用c,c++等面向过程的语言的原因之一。
*/

//可以发现每个节点的next指针域中存放着一个对象,这个对象就是定义的单链表的一个节点
//
//统计节点数量
function CountNode($head){
    $current = $head;//将当前节点设置为头结点
    $i = 0;
    while(!is_null($current->next)){
        ++$i;
        $current = $current->next;
    }
    return $i;
}
//遍历节点
function fetchNode($head){
    $current = $head;//在此需要注意一个问题,在php中对象的赋值,其实是对象地址的赋值,即$current = &$head,所以操作$current就相当于操作$head
    while(!is_null($current->next)){
        $current = $current->next;
        echo $current->data.'->';
    }
}
//在末尾增加节点(原理就是通过遍历链表,在链表末尾插入一个值为val,next为null的节点)
function addNode($head,$val){
    $current = $head;
    $b = $head;
    while(!is_null($current->next)){
        $current = $current->next;
    }
    $new = new ListNode($val);
    $current->next = $new;
    return $b;
}
//删除节点
function delNode($head){
    $current = $head;
    while(!is_null($current->next)){
        $current = $current->next;
    }
    $current->next->next = null;
}

//逆转单链表
//单链表是从第一个节点开始遍历的
function reverseList($head) {
    if($head == null){
        return null;
    }
    $pre = null;
    while(!is_null($head)){
        $temp = $head->next;
        $head->next = $pre;
        $pre = $head;
        $head = $temp;
    }
    return $pre;
}
$head = new ListNode(null);
addNode($head,1);
echo CountNode($head);

//addNode($head,2);
//addNode($head,3);
//addNode($head,4);
//addNode($head,5);
//$a = reverseList($head);
//var_dump($a);
//fetchNode($a);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值