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 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...
随机推荐
- 机器学习11—Apriori学习笔记
votesmart下载 https://pypi.python.org/pypi/py-votesmart test11.py #-*- coding:utf-8 import sys sys.pa ...
- linux系统寻找僵尸进程
1. 用top命令来查看服务器当前是否有僵尸进程. 2. 用ps和grep命令寻找僵尸进程 $ ps -A -ostat, pid, ppid, cmd | grep -e '^[Zz]' 命令解释: ...
- jq bootstrap select 点击不能动弹
jq bootstrap select 点击不能动弹 因为是样式selectpicker 冲突. 解决办法换 样式 form-control <select name="ty ...
- CLR内存回收总结,代龄机制
关键字:对象可达图,代龄机制,终止化对象. 代龄机制: 0代满了之后,GC开始回收,剩下的对象升级为1代.(只有不可达的对象才会被回收.) 0代再回收几次之后,1代的对象慢慢增多然后达到阈值,GC同时 ...
- Java多线程编程总结一:多线程基本概念
Java多线程编程总结一 – 初识多线程 进程.多进程.线程.多线程的概念 进程(process):CPU的执行路径.通俗的说就是系统中正在运行的程序.比如我们打开了浏览器.QQ等等,这些程序一旦被打 ...
- 线段树专题—HDU1698 Just a Hook
题意:t组数据,给一个n.m表示n长度的钩和m次操作.初始钩子的每单位长度的价值为1,接下来输入 x,y,k 的操作把钩子[x,y]区间的价值替换为k,求m次操作后钩子的价值为多少 分析:成段替换.最 ...
- shell遍历文件目录,监听文件变化,拼接字符串
最近利用业余时间学习了shell 并做了个例子 实现的功能是 : 监听demo文件夹下的文件,只要新增了 .js的文件就把对应的文件名重组,拼接, 最后写入到demo.js里面. 文件结构如下 : ...
- ubuntu study
1.statement a.Fist af all,I think myself be to study miv in instruction. b.again,I think myself be t ...
- jquery基础研究学习【HTML】
jQuery HTMLjQuery 捕获jQuery 设置jQuery 添加元素jQuery 删除元素jQuery CSS 类jQuery css() 方法jQuery 尺寸 笔记:
- 九度OJ 1355:扑克牌顺子 (模拟)
时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:1676 解决:484 题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^). ...