由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题
2019年2月25日14:21:13
测试版本php 5.4 ,5.6,7.0,7.2
代码请看: https://www.cnblogs.com/zx-admin/p/10373866.html
1,对象赋值
final class Node { public $data;
public $next = null; public function __construct($data) {
$this->data = $data;
} } $a = new Node(['a']);
p($a->data);
$b = $a;
//修改$a的data看是否影响
$a->data = 'sssss';
p($b->data);
Array
(
[0] => a
)
sssss
会影响$a的数据
$b = &$a;
$b = $a;
对于对象来说就是取地址符,但是注意PHP的&不是取地址符,是别名,注意这个是官方解释,但是注意下面的 对象传参,又是另一种写法
$b = clone $a;
会裂变成连个完全独立的内存地址指向
2,对象传参,或者对象传值,对象数据内部遍历指针的问题
代码
final class Node { public $data;
public $next = null; public function __construct($data) {
$this->data = $data;
} } final class LinkedList { // //从链表尾部压入一个节点,节点自动维护,不需要要像main方法那样自己维护
public function push(Node $head, Node $Node) {
$current = $head; //让$current指向$head;
while ($current->next != null) {
$current = $current->next;
}
$current->next = $Node->next;
$current->next = $Node;
} //从链表尾压出一个节点
public function pop(Node $head) {
$current = $head; //让$current指向$head;
while ($current->next != null) {
//提前查找链表尾部是否为空,为空就是尾部,吧当前节点的next复制问NULL,就是尾部元素干掉
if ($current->next->next == null) {
break;
}
$current = $current->next;
}
$current->next = null;
} } $head = new Node([]);
$a = new Node(['a']);
$b = new Node(['b']);
$c = new Node(['c']);
$d = new Node(['d']); $LinkedList = new LinkedList();
$LinkedList->push($head, $a);
$LinkedList->push($head, $b);
$LinkedList->push($head, $c);
$LinkedList->push($head, $d);
$LinkedList->pop($head);
pp($head);
结果
Node Object
(
[data] => Array
(
) [next] => Node Object
(
[data] => Array
(
[0] => a
) [next] => Node Object
(
[data] => Array
(
[0] => b
) [next] => Node Object
(
[data] => Array
(
[0] => c
) [next] =>
) ) ) )
现阶段从结果反推的是对象传参,会自动变成引用对象传参,就是我们平常的写法
function functionName(&$param) { }
类似这种的效果
但是,这个还不是关键
这段代码才是关键
public function push(Node $head, Node $Node) {
$current = $head; //让$current指向$head;
while ($current->next != null) {
$current = $current->next;
}
$current->next = $Node->next;
$current->next = $Node;
}
还可以写成这样的
public function push(Node $head, Node $Node) { while ($head->next != null) {
$head = $head->next;
}
$head->next = $Node->next;
$head->next = $Node;
}
按照我们正常的理解,遍历一个对象 $head 被再次复制,那么遍历到最后$head->next = $Node;应该只剩一个对象元素才对
但是打印 pp($head);依然是没有问题是一个完整的链表
因为无法理解这个遍历过程 pop方法我写了两天无法完成,后来是通过画出链表结构才写出来的了,同时参考了
https://blog.csdn.net/wenximalong/article/details/8296061
但是依然无法理解遍历对象的为什么不管有没有指向$head 的变量使用while遍历的时候发生了什么,这种结构的树状的对象数据,for或者foreach 当然不好使
请参看
https://www.cnblogs.com/zx-admin/p/9820866.html
如果硬要解释的话,不管for foreach while key next 等方法,在使用的时候都独立维护这一套指针,为了完成复杂的指针,指针移动完成不会影响传入的变量或者变量对象
画了个示意图,不保证完全正确,不具备给他们语言的参考性,注意!
就相当于while给你走指针,自己处理处理数据就可以,简单化了操作,复杂了理解,不确定是否理解正确,如果有问题请反馈
由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题的更多相关文章
- jQuery对象初始化的传参方式
jQuery对象初始化的传参方式包括: 1.$(DOMElement) 2.$(' ... '), $('#id'), $('.class') 传入字符串, 这是最常见的形式, 这种传参数经常也传入第 ...
- js 日期对象Date以及传参
创建一个日期对象,日期对象可传参new Date() 创建日期对象getFullYear() 获取年份 getMonth() 获取月份 返回值是 0(一月) 到 11(十二月) 之间的一个整数 get ...
- Python开发:OpenCV版本差异所引发的cv2.findContours()函数传参问题
一.问题如下: cv2.findContours()这个方法是用来找出轮廓值的: # cv2.findContours找出轮廓值,cv2.RETR_EXTERNAL表示图像的外轮廓 binary, c ...
- Java的对象传参问题
在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.之前有搜过相关的知识点一直理解的是:Java的传参方式中主要有两种: ...
- Python对象赋值、浅拷贝、深拷贝
Python中,基本数据类型,理解为常见数据类型:布尔型.整型.浮点型.字符串.列表.元组.字典.集合,随语言不同而不同,但是根据在内存中存储方式的不同,区分开原子类型和容器类型. 对象赋值 对象的赋 ...
- O-C相关-06:对象与对象的关系
对象与对象的关系 1.对象与对象的关系 依赖 关联 组合 常常讨论对象与对象关系时会提供两个属于:内聚性,耦合性 内聚一般指功能上的指向性 耦合一般指关联上的依赖性 2.依赖: 对象之间最弱的一种关联 ...
- Django运算表达式与Q对象/F对象
Django运算表达式与Q对象/F对象 1 模型查询 概述: 1 查询集:表示从数据库中获取的对象的集合 2 查询集可以有多个过滤器,通过 逻辑运算符连接 3 过滤器就是一个函数,基于所给的参数限制查 ...
- 异常详细信息: System.InvalidOperationException: 对象的当前状态使该操作无效
源错误: 执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 堆栈跟踪: [InvalidOperationException: 对象的当前 ...
- php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))
php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...
随机推荐
- webpack学习记录
webpack 中文网站 https://webpack.docschina.org/ webpack1 有编译打包 模块热更新 代码分割 文件处理功能 webpack2 tree Shaking( ...
- Spring系列(六) Spring Web MVC 应用构建分析
DispatcherServlet DispatcherServlet 是Spring MVC的前端控制器名称, 用户的请求到达这里进行集中处理, 在Spring MVC中, 它的作用是为不同请求匹配 ...
- HBSX2019 游记
Day -4 训练戳SX2019 3月训练 ZJOI2019 Day1几天前就考了 T1真考了麻将QwQ 九条可怜的毒瘤真的是业界良心 今天中午才起,要开始调整生物钟了 9012HBOIers群里讨论 ...
- NB-IoT省电模式:PSM、DRX、eDRX【转】
转自:https://blog.csdn.net/zoomdy/article/details/80447372 NB-IoT支持三种省电模式:PSM (Power Saving Mode,省电模式) ...
- sql server的sysobjects表中xtype字段值的含义
xtype字段包含的值的意思如下: AF = Aggregate function (CLR) 聚合函数(CLR) C = CHECK constraint CHECK约束 D = Default ...
- linux ps top 命令 VSZ,RSS,TTY,STAT, VIRT,RES,SHR,DATA的含义
VIRT:virtual memory usage 虚拟内存1.进程“需要的”虚拟内存大小,包括进程使用的库.代码.数据等2.假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而 ...
- Kali Linux 更新源
1. Kali Linux更新源 更换更新源,命令行中执行一下命令 /etc/apt/sources.list 2 替换sources.list里面的内容 可以使用以下三个源(使用一个即可) #ka ...
- mysql case when * else end
分条件计算总数 SELECT -- SUM( END) as am, -- SUM( END) as om , -- SUM( END) as aom , -- SUM( then AmoutPric ...
- Redis数据结构之intset
本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis数据结构之robj>,我们说到redis object数据结构,其有5中数据类型:OBJ_STRING,OBJ_LIST ...
- 英语口语练习系列-C35-马戏-谈论语言-己亥杂诗
词汇-马戏 circus audience spectator spotlight bandstand magic magician clown spacious attractive product ...