php mysql 链表_php实现数据结构的单向链表
啥是单向链表
链表是以链式存储数据的结构,其不需要连续的存储空间,链表中的数据以节点来表示,每个节点由元素(存储数据)和指针(指向后继节点)组成。
单向链表(也叫单链表)是链表中最简单的一种形式,每个节点只包含一个元素和一个指针。
它有一个表头,并且除了最后一个节点外,所有节点都有其后继节点。
它的存储结构如下图所示
代码实现
定义节点
class Node
{
public $data;
/**
* @var null | Node
*/
public $next;
public function __construct($data)
{
$this->data = $data;
$this->next = null;
}
}
单链表实现
/**
* Class SingleLinkList
* 单链接的实现示例,实现简单的填加,插入,删除, 查询,长度,遍历这几个简单操作
*/
class SingleLinkList
{
/**
* 链表头结点,头节点必须存在,
* @var Node
*/
public $header;
private $size = 0;
/**
* 构造函数,默认填加一个哨兵节点,该节点元素为空
* SingleLinkList constructor.
*/
public function __construct()
{
$this->header = new Node(null);
}
/**
* 在链表末尾添加节点
* @param Node $node
* @return int
*/
public function addNode(Node $node)
{
$current = $this->header;
while ($current->next != null) {
$current = $current->next;
}
$current->next = $node;
return ++$this->size;
}
/**
* 在指定位置插入节点
* @param int $index 节点位置,从1开始计数
* @param Node $node
* @return int
* @throws Exception
*/
public function insertNodeByIndex($index, Node $node)
{
if ($index < 1 || $index > ($this->size + 1)) {
throw new Exception(sprintf('你要插入的位置,超过了链表的长度 %d', $this->size));
}
$current = $this->header;
$tempIndex = 1;
do {
if ($index == $tempIndex++) {
$node->next = $current->next;
$current->next = $node;
break;
}
} while ($current->next != null && ($current = $current->next));
return ++$this->size;
}
/**
* 删除节点
* @param int $index 节点位置,从1开始计数
* @return int
* @throws Exception
*/
public function deleteNodeByIndex($index)
{
if ($index < 1 || $index > ($this->size + 1)) {
throw new Exception('你删除的节点不存在');
}
$current = $this->header;
$tempIndex = 1;
do {
if ($index == $tempIndex++) {
$current->next = $current->next->next;
break;
}
} while ($current->next != null && ($current = $current->next));
return --$this->size;
}
/**
* 查询节点
* @param int $index 节点位置,从1开始计数
* @return Node|null
* @throws Exception
*/
public function searchNodeByIndex($index) {
if ($index < 1 || $index > ($this->size + 1)) {
throw new Exception('你查询的节点不存在');
}
$current = $this->header;
$tempIndex = 1;
do {
if ($index == $tempIndex++) {
return $current->next;
}
} while ($current->next != null && ($current = $current->next));
}
/**
* 获取节点长度
* @return int
*/
public function getLength()
{
return $this->size;
}
/**
* 遍历列表
*/
public function showNode()
{
$current = $this->header;
$index = 1;
while ($current->next != null) {
$current = $current->next;
echo 'index --- ' . $index++ . ' --- ';
echo var_export($current->data);
echo PHP_EOL;
}
}
}
示例
$link = new SingleLinkList();
$link->addNode(new Node(1));
$link->addNode(new Node(2));
$link->insertNodeByIndex(3, new Node(3));
$link->addNode(new Node(4));
$link->addNode(new Node(5));
echo $link->getLength(), PHP_EOL;
$link->showNode();
echo '-----------', PHP_EOL;
var_dump($link->searchNodeByIndex(3));
echo '-----------', PHP_EOL;
$link->deleteNodeByIndex(3);
$link->showNode();
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里
php mysql 链表_php实现数据结构的单向链表相关推荐
- 数据结构 (二) ----- 单向链表双向链表
相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...
- Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)
Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...
- Java版数据结构之单向链表
Java版数据结构之单向链表 我的代码仓库:https://github.com/zhuangbinan/datastructure package club.zhuangbinan.linkedli ...
- java数组转换成单链表_【转】单向链表(单链表)的Java实现
最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因 ...
- 算法与数据结构(part6)--单向链表
学习笔记,仅供参考,有错必纠 参考自:单链表头指针.头结点.头元结的辨析 文章目录 算法与数据结构–基于python 链表 为啥需要链表 什么是链表 单向链表 什么是单向链表 单列表的操作 节点的实现 ...
- 数据结构与算法java - 03 链表,单向链表,逆序打印单向链表
链表 Linked List 有序 链表是以节点的方式来存储,链式存储 每个节点包含 data 域, next 域:指向下一个节点 链表的各个节点不一定是连续存放 链表分带头节点的链表和没有头节点的链 ...
- 数据结构入门——单向链表
基本知识点 注:数据结构系列将持续更新,欢迎交流讨论- 单向链表是一种线性结构 优点:作数据的删除.插入简单:缺点:数据查找慢 组成:数据域.后继节点的一个指针域: 单向链表,后继指针指向下一个结点 ...
- Day 62 数据结构(单向链表,单向循环链表,双向链表)
1. 单向链表的设计 例程:创建一个动态单向链表 1.定义链表结点:数据域+指针域 2.定义链表结构体:头结点指针+结点数 3.初始化链表 4.指定位置插入新数据 5.删除指定位置数据 6.获取链表长 ...
- 数据结构——求单向链表的倒数第K个节点
首先,对于链表来说,我们不能像数组一样直接访问,所以我们想到要求倒数第K个节点首先要知道最后一个节点. 然后从最后一个节点往前数K个. 最后得到想要的值. 但是这是不对的,为什么呢?因为题目给出的是单 ...
最新文章
- 第六篇:并发-粒度锁
- 特斯拉CEO对自动驾驶发表预测,专家:别扰乱公众的认知了
- 什么是优秀管理者的第一课?【如何搞垮一个企业】
- 如何接地气地接入微前端?
- python模式选择符,Python设计模式之修饰器模式
- 关于html以及js相关格式验证的记录
- 物联网大数据平台软件开发架构案例解析
- Swift类属性 static
- 前端开发所需基本环境和软件配置
- 网络社区划分的算法分类
- 勒索病毒代码python_一份勒索病毒解密工具的整理汇总
- SQL Server_SQL Server Windows NT - 64 bit
- 神经网络的反向传播算法中矩阵的求导方法(矩阵求导总结)
- 个人中心网页设计html,超全面!个人中心页面从思考到设计全过程
- 小白刷LeeCode(算法篇)3
- 善用EFI系统分区ESP
- 外包四年太差劲,幡然醒悟要跳槽
- gravity 安装部署
- php对接AliGenie天猫精灵服务器控制智能硬件esp8266③ 渗入熟悉AliGenie 对接协议,揭开第三方云平台是如何让天猫精灵是发送消息到私有服务器的!
- 基于模拟退火算法改进粒子群SA-PSO优化shubert函数,测试函数shubert(十),MATLAB编程实现
热门文章
- PHP-代码审计-身份认证
- LeetCode Algorithm 897. 递增顺序搜索树
- 2018/Province_Java_C/3/字母阵列
- 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - H. 等差数列
- 198. House Robber
- 智宇科技 ZYARJX-1机械臂智能小车 —— 手机端蓝牙控制程序
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1101:不定方程求解
- 大数据互联网架构阶段 Java爬虫
- bashrc文件实例
- 【Tools】gcc4.4升级到gcc4.8