1. 特征
2. 时间复杂度
操作 | 时间复杂度 |
---|
添加 | O(1) |
更新 | O(n) |
删除 | O(n) |
查询 | O(n) |
3. 代码
<?php
/**
* content: 图的节点元素
* create: 2020-11-03
*/
namespace MapBundle;
class Node
{
/**
* 尾指针
* @var Node|null
*/
protected $tail;
/**
* 该节点存储的key
* @var string|int
*/
protected $key;
/**
* 该节点存储的value
* @var mixed
*/
protected $value;
public function __construct($key = null, $value = null, ?Node $tail = null)
{
$this->setTail($tail)->setKey($key)->setValue($value);
}
/**
* 设置尾结点
* @param Node|null $tail
* @return $this
*/
public function setTail(?Node $tail): self
{
$this->tail = $tail;
return $this;
}
/**
* 获取尾结点
* @return Node|null
*/
public function getTail(): ?Node
{
return $this->tail;
}
/**
* 设置key
* @param string|int $key
* @return $this
*/
public function setKey($key): self
{
$this->key = $key;
return $this;
}
/**
* 获取结点里的key
* @return mixed
*/
public function getKey()
{
return $this->key;
}
/**
* 设置值
* @param mixed $value
* @return $this
*/
public function setValue($value): self
{
$this->value = $value;
return $this;
}
/**
* 获取结点里的值
* @return mixed
*/
public function getValue()
{
return $this->value;
}
}
<?php
/**
* content: 图(链表实现)
* auth: 俞佳明
* create: 2020-11-03
*/
namespace MapBundle;
class LinkMap
{
/**
* @var Node|null
*/
protected $node;
/**
* 集合大小
* @var int
*/
protected $size;
public function __construct()
{
$this->node = null;
$this->size = 0;
}
/**
* 获取集合中的元素
* @return int
*/
public function getSize(): int
{
return $this->size;
}
/**
* 查询是否存在该值的结点
* @param $key
* @return Node|null
*/
public function contains($key): ?Node
{
$node = $this->node;
while (!is_null($node)) {
if ($node->getKey() === $key) {
return $node;
}
$node = $node->getTail();
}
return null;
}
/**
* 插入
* @param string|int $key
* @return Node
* @throws \Exception
*/
public function add($key): ?Node
{
if (is_null($this->contains($key))) {
// 添加新的
$newNode = new Node($key, 1, null);
$newNode->setTail($this->node);
$this->node = $newNode;
$this->size++;
return $newNode;
} else {
// 在原基础上自增
$node = $this->node;
while (!is_null($node)) {
if ($node->getKey() == $key) {
$node->setValue($node->getValue() + 1);
return $node;
}
}
}
return null;
}
/**
* 删除
* @param $key
*/
public function remove($key)
{
// 如果图中不存在元素就返回
if (is_null($this->node)) return;
// 如果删除的是第一个结点
if ($this->node->getKey() == $key) {
$this->node = $this->node->getTail();
$this->size--;
return;
}
// 删除第二个结点及以后
$node = $this->node;
while (!is_null($node->getTail())) {
if ($node->getTail()->getKey() === $key) {
$node->setTail($node->getTail()->getTail());
$this->size--;
return;
}
$node = $node->getTail();
}
return;
}
public function varDump()
{
$node = $this->node;
while (!is_null($node)) {
echo $node->getKey(). " >> ". $node->getValue(). PHP_EOL;
$node = $node->getTail();
}
}
}
4. 示例
<?php
require_once __DIR__ . '/../../vendor/autoload.php';
$map = new MapBundleLinkMap();
// 插入结点
$map->add('a');
$map->add('a');
$map->add('c');
$map->add('c');
$map->add('d');
$map->add('d');
$map->add('b');
$map->add('b');
// 移除结点
$map->remove('b');
// 打印
$map->varDump();
d >> 2
c >> 2
a >> 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。