php实现集合,5. 数据结构(PHP实现) -- 集合 (用链表来实现)

1. 特征集合内的元素不会重复,所以在添加的时候就需要判断是否有元素存在

2. 时间复杂度分析操作时间复杂度添加O(1)

删除O(n)

查询O(n)

3. 代码元素结点/**

* content: 集合的元素结点

* create: 2020-11-03

*/

namespace SetBundle;

class Node

{

/**

* 尾指针

* @var Node|null

*/

protected $tail;

/**

* 该节点存储额值

* @var mixed

*/

protected $value;

public function __construct($value = null, ?Node $tail = null)

{

$this->setTail($tail)->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;

}

/**

* 设置值

* @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 SetBundle;

class LinkSet

{

/**

* @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 $value

* @return Node|null

*/

public function contains($value): ?Node

{

$node = $this->node;

while (!is_null($node)) {

if ($node->getValue() === $value) {

return $node;

}

$node = $node->getTail();

}

return null;

}

/**

* 插入

* @param string|int $value

* @return Node

* @throws \Exception

*/

public function add($value): Node

{

$newNode = new Node($value, null);

if (is_null($this->node)) {

$this->node = $newNode;

} else {

if (!is_null($this->contains($value))) {

throw new \Exception('插入的元素已存在!');

}

$newNode->setTail($this->node);

$this->node = $newNode;

}

$this->size++;

return $newNode;

}

/**

* 删除

* @param $value

*/

public function remove($value)

{

// 如果图中不存在元素就返回

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->getValue(). PHP_EOL;

$node = $node->getTail();

}

}

}

4. 示例<?php

require_once __DIR__ . '/../../vendor/autoload.php';

$set = new SetBundleLinkSet();

$set->add(1);

$set->add(2);

$set->add(3);

$set->add(4);

$set->add(5);

$set->add(6);

$set->varDump();6

5

4

3

2

1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值