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 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...
随机推荐
- html中keydown事件
实现在输入框按回车按钮进行查询的功能: 1.<input type="text" id="inputChannel" onkeydown="ke ...
- redis+node.js
1.什么的cache 是一种更快的记忆存储数据集 存储空间有限 储存一部分重要数据 是一种相对的概念,只要比原本数据存储更快的介质就能作为cache 2.caching 策略 有限的存储空间,只能存储 ...
- 用代码构造PreferenceScreen
在PreferenceFregment中构造界面,简单省事的方法就是使用findPreference然后在xml里把UI写好.在代码中动态的添加UI内容也是需要的.核心代码是: PreferenceS ...
- oracle10g卸载问题
oracle10g卸载是一个比较麻烦的事,一般要完全卸载有以下几个步骤: 实现方法:1.开始->设置->控制面板->管理工具->服务停止所有Oracle服务:2.开始-> ...
- 【Atheros】网卡驱动速率调整算法概述
我做网卡驱动,最主要的内容就是设计和改进速率调整算法,随着802.11协议簇的新标准越来越多,速率越来越高,调制编码方式也越来越多,一般来说,速率越高越可能丢包,速率越低越稳定,这是整体状况,但不是必 ...
- 【POJ-2524】Ubiquitous Religions(并查集)
并查集. #include<cstdio> #include<cstring> using namespace std; const int maxn = 55555; int ...
- [CTSC2001]1378 选课
1378 选课 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这 ...
- IoC原理及实现
什么是IoC IoC是Inversion of Control的缩写,翻译过来为"控制反转".简单来说,就是将对象的依赖关系交由第三方来控制.在理解这句话之前,我们先来回顾一下I ...
- 【python】-- Socket接收大数据
Socket接收大数据 上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整 ...
- Bootstrap学习-菜单-按钮-导航
1.下拉菜单(基本用法) 在使用Bootstrap框架的下拉菜单时,必须调用Bootstrap框架提供的bootstrap.js文件.当然,如果你使用的是未编译版本,在js文件夹下你能找到一个名为“d ...