<?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);
PHP实现 单链表
最新推荐文章于 2024-08-10 17:12:07 发布
本文详细探讨了如何使用PHP实现单链表数据结构,从创建节点到链表的基本操作,如插入、删除和遍历。通过实例代码,帮助读者掌握PHP中单链表的实现原理和应用。
摘要由CSDN通过智能技术生成