单链表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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值