php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))
php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))
一、总结
一句话总结:
php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就是数值,链表节点的指针域的值就是对象(new Node()出来的产物)
用class来构建节点,也用class来构建比如单链表啊,双链表啊
1、链表是什么?
链表是一种物理存储(内存)单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过对象引用来实现的。
节点=数据域+下一个结点的引用
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点的引用。
2、php实现单链表实例?
节点是一个类:class Node{}:Node节点里面有两个变量($data和$next)和一个构造函数__construct()
php构造函数:public function __construct(){}
单链表也是一个类:有$header,$last,$size三个变量
<?php
class Node{
public $data = null;
public $next = null;
public function __construct($data,$next=null){
$this->data = $data;
$this->next = $next;
}
}
class singleLinkList{
private $header = null;
private $last = null;
public $size = 0;
public function __construct(){
}
public function add($data){
$node = new Node($data);
if($this->header == null and $this->last==null){
$this->header = $node;
$this->last = $node;
}else{
$this->last->next = $node;
$this->last = $node;
}
}
public function del($data){
$node=$this->header;
if($node->data == $data){
$this->header = $this->header->next;
return true;
}else{
while($node->next->data == $data){
$node->next = $node->next->next;
return true;
}
}
return false;
}
public function update($old,$new){
$node = $this->header;
while($node->next != null){
if($node->data == $old){
$node->data = $new;
return true;
}
$node = $node->next;
}
echo "not found!";
return false;
}
public function find($data){
$node = $this->header;
while($node->next != null){
if($node->data == $data){
echo "found!";
return;
}
$node = $node->next;
}
echo "not found!";
}
public function getAll(){
$node = $this->header;
while($node->next != null){
echo $node->data;
$node = $node->next;
}
echo $node->data;
}
}
$list = new singleLinkList();
$list->add("1");
$list->add("2");
$list->add("3");
$list->add("4");
$list->add("5");
$list->add("6");
echo "<pre>";
// $list->getAll();
// if($list->del("2")){
// echo "success";
// }else{
// echo "false";
// }
// if($list->update("3","7")){
// var_dump($list);
// }
$list->find(7);
// $list->getAll();
3、双向链表的数据结构是怎样?
<-pre data next->:data为数据,pre为指向前个节点的引用,next为指向后个节点的引用
class node{
public $data;
public $prev;
public $next;
}
class doubleLinkList{
public header;
private size;
} //操作函数getSize(),setHeader($v),__construct(),add($d)
// delete($d),update($d),find($d),
4、循环链表的结构结构是怎样?
和双向链表相似:data域加前($prev)后($next)两个指针:最后一个节点的next指针指向和第一个节点,第一个的prev指向了最后一个节点
5、约瑟夫环(求最后剩下的那个人)如何用循环链表来做,(n个小孩坐在一圈,每数到3就退出去,最后余下的是谁)?
确定好Node节点的属性和方法
确定构造函数:创建链表
circleList的另外一个方法输出最后剩下的那个人
<?php
class Node{
public $name;
public $next;
public function __construct($name,$next=null){
$this->name = $name;
$this->next = $next;
}
public function setNext(&$next){
$this->next = $next;
}
}
class circleList{
public $head =null;
public function __construct($str){
$node = null;
foreach (explode(" ", $str) as $key => $value) {
if($node){
$node->setNext(new Node($value));
$node= $node->next;
}else{
$node = new Node($value);
$this->head = $node;
}
}
$node->setNext($this->head);
// echo "<pre>";
// var_dump($this->head);
}
public function findLastOne($n){
$count = 1;
$list = $this->head;
while($list->next != $list){
if($count%3==2){
$list->next=$list->next->next;
}else{
$list=$list->next;
}
$count++;
}
return $list->name;
}
}
$str = "圣夏彤 邴丹丹 台浩邈 鲜依瑶 闪又青 威心远 佛乐正 寻仙韵 别光华 柳舒兰
闻清婉 让昕珏 出欣跃 慎诗丹 卿冬萱 拜若薇 黄梦秋 浮娅玟 骆飞章 剑成化
平海荣 望凡霜 蔡雪萍 姓慧颖 秋访梦 须盈秀 邰宣朗 林安彤 谬祺然 能骏琛
汤香菱 查寻琴 乾问凝 冒听筠 左诗兰 市暄美 位水丹 裔翠芙 邗宏博 空永长
进南霜 司空新雪 穆乐蓉 绪野雪 告天瑞 仁桂帆 齐珠雨 姒以冬 禽夏菡 呼延兰英
简小雨 建彤蕊 偶迎南 南夏岚 枝傲菡 罗蔚星 年博简 夔代巧 戈曼蔓 赫麦冬
光美如 戏柔惠 恭千秋 森寄蕾 亓娴淑 豆飞瑶 菅尔容 斋依云 荆紫杉 宦雪容
酒含景 占碧蓉 牵盼香 唐青雪 清映秋 瑞和璧 蓝听春 牛新洁 沐妙思 胥雍恬
饶鸿光 丹乐然 抄曼吟 张廖智杰 府念云 昔德宇 尧平安 尹芳泽 勤清妍 哀清莹
柴佩珍 夹谷昆琦 塔思琪 虞采萱 融水荷 招采萱 势鸿志 次长岳 费莫怀芹 始修真";
$list = new circleList($str);
echo $list->findLastOne(3);
二、内容在总结中
php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))的更多相关文章
- Java数据结构和算法(一)线性结构之单链表
Java数据结构和算法(一)线性结构之单链表 prev current next -------------- -------------- -------------- | value | next ...
- 【数据结构】单链表介绍及leetcode206题反转单链表python实现
题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...
- 链表习题(8)-寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下
/*寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下*/ /* 算法思想:定义两个指针,pre指向前驱结点,p指向当前结点,当p->data == k的时候,交换 p ...
- LeetCode 237. 删除链表中的节点 (单链表遍历)
题目链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将 ...
- C#数据结构与算法系列(五):常见单链表笔试
1.求单链表中有效节点个数 public static int GetLength(HeroNode headNode) { int length = ; var cur = headNode.Nex ...
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...
- 数据结构(一) 单链表的实现-JAVA
数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...
- 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)
链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...
随机推荐
- NYOJ 613 免费馅饼
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...
- My sql 5.7 安装及错误解决
安装MYSQL5.7时,一直不能启动服务,找了N多办法,一直在围绕MY.INI文件来改来改去. 实际情况是,PATH路径设置完成后(计算机——属性—高级设置-环境变量——path),要执行以下命令初始 ...
- Office365client通过本地方式批量部署(即点即用部署)
当企业用户拥有Office 365 ProPlus的许可后,可登陆Office 365.自行下载Officeclient安装部署 以上仅仅是理想情况,实际情况是企业用户较多,IT水平參差不齐,企业的带 ...
- RHEL7安装部署ZooKeeper
转载请注明出处:jiq•钦's technical Blog - 季义钦 文章说明: 分布式注冊中心(链接)须要安装的组件包括两个部分: 1.注冊中心服务(Zookeeper) 2.站点(Tomcat ...
- Lumen开发:Lumen的异常处理机制
版权声明:本文为博主原创文章,未经博主允许不得转载. Lumen的核心类Application引用了专门用于异常处理的RegistersExceptionHandlers, class Applica ...
- Linux 随手记(文件操作)
新建文件夹 mkdir 文件夹名 新建文件 touch 文件名 重命名 mv 文件名 新文件名 将/a目录移动到/b下,并重命名为c mv /a /b/c 复制文件 cp [选项] 源文件或目录 目标 ...
- 【BZOJ1492】[NOI2007]货币兑换Cash 斜率优化+cdq分治
[BZOJ10492][NOI2007]货币兑换Cash Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下简称B券).每 ...
- Android系统移植与调试之------->如何修改Android设备的默认休眠时间
1.找到~/mx0831-0525/frameworks/base/packages/SettingsProvider/res/values/ defaults.xml文件 2.修改默认休眠时间 3. ...
- 使用parted 对大容量盘进行分区
MBR分区表:(MBR含义:主引导记录) 所支持的最大卷:2T (T; terabytes,1TB=1024GB) 对分区的设限:最多4个主分区或3个主分区加一个扩展分区. GPT分区表:(GPT含义 ...
- 论文解析 "A Non-Local Cost Aggregation Method for Stereo Matching"
传统的使用窗口的方法缺陷主要在 1.窗口外的像素不能参与匹配判断. 2.在低纹理区域很容易产生错误匹配 论文的主要贡献在代价聚类上(左右图像带匹配点/区域的匹配代价计算),目标是图像内所有点都对该点传 ...