链表
链表
标签(空格分隔): 数据结构和算法
理解链表
链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址
PHP实现单链表
<?php
class Node
{
/**
* 数据
* @var $value
*/
public $value;
/**
* 指向下一个节点
* @var $next
*/
public $next;
public function __construct($value = null, $next = null)
{
$this->value = $value;
$this->next = $next;
}
}
class LinkedList
{
/**
* Node节点
* @var Node $head
*/
private $head;
/**
* 数量
* @var int $size
*/
private $size;
public function __construct()
{
$this->head = new Node();
$this->size = 0;
}
/**
* 头部插入数据
* @param $value
*/
public function addByHead($value)
{
$this->head->next = new Node($value, $this->head->next);
$this->size++;
}
/**
* 尾部插入数据
* @param $value
*/
public function addByTail($value)
{
$node = $this->head;
while ($node->next != null) {
$node = $node->next;
}
$node->next = new Node($value);
$this->size++;
}
/**
* 指定位置后插入
* @param $indexValue
* @param $value
* @return bool
*/
public function addByIndex($indexValue, $value)
{
$node = $this->head;
while ($node->next != null) {
$node = $node->next;
if ($node->value == $indexValue) {
$node->next = new Node($value, $node->next);
return true;
}
}
return false;
}
/**
* 更新节点的值
* @param $oldValue
* @param $newValue
* @return bool
*/
public function update($oldValue, $newValue)
{
$node = $this->head;
while ($node->next != null) {
$node = $node->next;
if ($node->value == $oldValue) {
$node->value = $newValue;
return true;
}
}
return false;
}
/**
* 移除节点
* @param $value
* @return bool
*/
public function remove($value)
{
$node = $this->head;
// $flag = null;
// while ($node->next != null) {
// $node = $node->next;
// if ($node->value != $value) {
// $flag = $node;
// } else {
// break;
// }
// }
// var_dump($flag);die;
while ($node->next != null && $node->next->value != $value) {
$node = $node->next;
}
if ($node) {
$node->next = $node->next->next;
return true;
}
return false;
}
/**
* 清空
* @return bool
*/
public function clear()
{
$this->head = null;
$this->size = 0;
return true;
}
/**
* 是否为空
* @return bool
*/
public function isEmpty()
{
return (boolean) $this->getSize();
}
/**
* @return string
*/
public function toString()
{
$node = $this->head;
$r = [];
while($node->next != null){
$node = $node->next;
$r[] = $node->value;
}
return implode('->',$r);
}
/**
* @return int
*/
public function getSize(): int
{
return ($this->size);
}
}
$linkedList = new LinkedList();
var_dump($linkedList->isEmpty());
$linkedList->addByTail("hello-one");
$linkedList->addByTail("hello-two");
$linkedList->addByTail("hello-three");
$linkedList->addByTail("hello-for");
$linkedList->addByTail("hello-five");
$linkedList->addByHead("hello-six");
$linkedList->addByHead("hello-seven");
$linkedList->addByHead("hello-eight");
$linkedList->addByIndex("hello-six", "hello**world");
$linkedList->update("hello**world", "PHP");
$linkedList->remove("hello-one");
$linkedList->remove("hello-two");
var_dump($linkedList->getSize());
var_dump($linkedList->toString());
var_dump($linkedList->isEmpty());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理