分为两个类:定义结构和实现单链表
实现链表插入,读取,删除
<?php
/**
* PHP 单链表
*/
/**
* TODO:构建链表节点
*
*/
Class Node
{
public $data;
public $next;
public function __construct($val, $nex)
{
$this->data = $val;
$this->next = $nex;
}
}
/**
* TODO:构建单链表
*/
Class SingleLinkList
{
public $list;
public function newNode($data = null, $next = null)
{
$this->list = new Node($data, $next);
}
//在链表的第i个位置前插入一个元素e,复杂度为o(n)
public function insert(int $i, int $e)
{
$p = $this->list;
$j = 1;
while (null != $p && $j < $i) {
$p = $p->next;
$j++;
}
if (null == $p || $j > $i) {
echo "pls check i: " . $i;
return false;
}
$s = new Node($e, null);
$s->next = $p->next;
$p->next = $s;
return true;
}
/**
* TODO:读取链表中第i个数据
* @param $list object 待插入的链表
* @param $i int 节点序号
*/
public function readIThNode($i)
{
$list = $this->list;
/* 如果链表为空或者i小等于0 */
if ($list == null || $i <= 0) {
echo "输入参数不合法";
return;
}
/* */
$p = $list; #设置p指向第一个节点(即头节点的后继节点))
$j = 0; #计时器必须初始化
while ($p && $j < $i) {
$p = $p->next;
++$j;
}
/* 第i步 */
if ($p == null) { #说明链表已经结束,不存在i节点,过滤掉i大于链表长度的情况(因为节点是散列的,事先并不知道其长度)
echo "i长度大于链表长度";
exit;
} else {
$e = $p->data; #第i个节点存在 ,返回
return $e;
}
}
/**
* TODO:删除链表的第i个节点,并返回该节点的值
* @param $i int 节点序号
* @return mixed
*/
public function Delete($i)
{
$list = $this->list;
if ($list == null || $i <= 0) {
echo "null";
exit;
}
$p = $list->next; #设置p指向第一个节点
$j = 0; #计时器必须初始化
while ($p && $j < $i) {
$p = $p->next; #保证节点在向后移动
++$j;
}
/* 第i步 */
if ($p == null) { #说明链表已经结束,不存在i节点,过滤掉i大于链表长度的情况,以为若i大于链表长度,则上面循环会跳出直接进入判断然后返回
echo "不存在i节点";
exit;
} else {
/* 标准的删除语句 */
$q = $p->next;
$p->next = $q->next;
$e = $q->data;
unset($q);
return $e;
}
}
/**
* TODO:删除整张链表
*
*/
public function DeleteAll()
{
$list = $this->list;
if ($list == null) {
echo "null";
exit;
}
$p = $list->next; #设置p指向第一个节点
while ($p != null) {
$q = $p->next; #保证节点在向后移动
unset($p);
$p = $q;
}
}
//遍历读取
public function Traverse()
{
$this->list = $this->list->next;
while (null != $this->list) {
echo $this->list->data . "\n";
$this->list = $this->list->next;
}
}
}
$l1 = new SingleLinkList();
$l1->newNode();
$l1->insert(1,4);
$l1->insert(1,5);
var_dump($l1->readIThNode(2));
$l1->Traverse();
$l1->DeleteAll();
$l1->Traverse();