PHP链表
时间:2019-01-11
本文章向大家介绍PHP链表,主要包括PHP链表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
/**
* 链表
* 优点:可以不需要规定长度,任意添加或删除节点
* 缺点:想要获取链表中的某个值,就需要遍历链表,直到找出这个值
* 这个只是在演示,如果在并发环境中使用可能要加锁
*/
class Node
{
private $value = null;
private $next = null;
public function __construct($value, $next = null)
{
$this->value = $value;
$this->next = $next;
}
public function setNext($node)
{
$this->next = $node;
}
public function getNext()
{
return $this->next;
}
public function getValue()
{
return $this->value;
}
}
class Linked implements Countable, Iterator
{
private $head = null;
private $tail = null;
private $current = null;
private $length = 0;
/**
* 添加节点
* @AuthorHTL neetdai
* @DateTime 2017-07-28T16:34:20+0800
* @param mixed
* 时间复杂度: O(1)
*/
public function add($value)
{
if ($this->head === null) {
$this->head = new Node($value);
$this->tail = $this->head;
$this->current = $this->head;
}else{
$node = new Node($value);
$this->tail->setNext($node);
$this->tail = $node;
}
$this->length++;
}
/**
* 删除指定位置的节点
* @AuthorHTL neetdai
* @DateTime 2017-07-28T16:38:21+0800
* @param int $position 位置
* @return bool
* 时间复杂度: O(n)
*/
public function deletePosition($position)
{
if ($position > $this->length || $position <= 0) {
return false;
}
$current = $this->head;
$count = 1;
//-------------------------------------
//这一部分其实应该能写得更简单一些,可是我不懂得怎样写
if ($position === 1) {
$deleted = &$this->head;
$this->head = $this->head->getNext();
$this->length--;
unset($deleted);
return true;
}
$current = $this->head;
for ($i=1; $i < $position - 1; $i++) {
$current = $current->getNext();
}
if ($current->getNext() === $this->tail) {
$deleted = &$this->tail;
$this->tail = $current;
$this->tail->setNext(null);
unset($deleted);
$this->length--;
return true;
}
$deleted = $current->getNext();
$deleted = &$deleted;
$current->setNext($deleted->getNext());
unset($deleted);
$this->length--;
//-------------------------------------
return true;
}
/**
* 返回链表的长度
* @AuthorHTL neetdai
* @DateTime 2017-07-27T18:38:32+0800
* @return int
* 时间复杂度: O(1)
*/
public function count()
{
return $this->length;
}
public function current()
{
return $this->current->getValue();
}
public function next()
{
$this->current = $this->current->getNext();
}
public function rewind()
{
$this->current = $this->head;
}
public function key()
{
return null;
}
public function valid()
{
return $this->current !== null;
}
}
$l = new Linked();
var_dump(count($l));
$l->add(1);
$l->add(2);
$l->add(3);
$l->add(4);
var_dump(count($l));
foreach ($l as $value) {
var_dump($value);
}
$l->deletePosition(2);
foreach ($l as $value) {
var_dump($value);
}
$l->deletePosition(2);
foreach ($l as $value) {
var_dump($value);
}
$l->deletePosition(2);
foreach ($l as $value) {
var_dump($value);
}
$l->deletePosition(1);
- GraphQL介绍&使用nestjs构建GraphQL查询服务
- 使用auth_request模块实现nginx端鉴权控制
- Docker学习之Docker镜像基本使用
- Docker学习之Centos7下安装
- Impala的Short-Circuit Reads
- js各种继承方式汇总
- Cloudera Navigator异常分析
- lodash源码分析之数组的差集
- lodash源码分析之baseFindIndex中的运算符优先级
- 在Ubuntu中安装Hadoop
- 如何编译及使用hive-testbench生成Hive基准测试数据
- lodash源码分析之缓存使用方式的进一步封装
- 文件包含与注入利用总结
- lodash源码分析之缓存方式的选择
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 经典排序算法-快速排序
- Stata | 解决 graph 中 x 轴刻度重叠问题
- Docker 垃圾回收机制补充
- 5分钟学会经典排序算法-归并排序
- Python | 爬取农业农村部政策法规并绘制词云图
- 5分钟学会经典排序算法-希尔排序
- Stata | 爬取企业景气指数与企业家信心指数
- Stata | 发出提示音的几种方式
- docker垃圾回收机制
- 让运维更简单的7种定时任务实现方式
- Notes | Chrome 浏览器常用快捷键
- Python | 从 PDF 中提取文本内容
- Stata | 自动生成中南财大2019拟录取硕士研究生分析报告
- Stata | 聊聊数据排序的几种方式
- 在生产中应用广泛的排序算法