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);
- HBase行锁与MVCC分析
- HBase行锁探索
- Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】
- HBase client访问ZooKeeper获取root-region-server DeadLock问题(zookeeper.ClientCnxn Unable to get data of zn
- zookeeper学习系列:四、Paxos算法和zookeeper的关系
- 有了phonegap你还android吗?
- zookeeper学习系列:三、利用zookeeper做选举和锁
- Spring Cloud构建微服务架构:分布式服务跟踪(收集原理)【Dalston版】
- zookeeper学习系列:二、api实践
- Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
- Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】
- 困扰我多年的Connection reset问题
- scala学习笔记
- jersey处理支付宝异步回调通知的问题:java.lang.IllegalArgumentException: Error parsing media type 'application/x-www
- 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
- 超全递归技巧整理,这次一起拿下递归
- [译] React 测试驱动开发:从用户故事到产品
- 计算机基础之位运算 | 按位取反
- 关于php的ini文件相关操作函数浅析
- PHP中的输出缓冲控制
- SpringCloud微服务:基于Nacos组件,整合Dubbo框架
- [译] 使用 microbundle 打包 TypeScript 组件库
- 3分钟短文 | Laravel 获取模型查询生成的SQL语句
- 基于git的测试用例管理方案
- 【赵渝强老师】MongoDB管理用户的认证机制
- 使用Microsoft Teams Updater执行代码
- 腾讯云 Serverless 云函数实现 CKafka 数据转存到 ES
- 软硬件都开源!基于千兆以太网的温度传感应用
- 【赵渝强老师】使用Docker Compose进行服务编排
- Kubernetes Pod入门指南