我的编程空间,编程开发者的网络收藏夹
学习永远不晚

php中链表的表现形式有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

php中链表的表现形式有哪些

这篇文章主要介绍php中链表的表现形式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

循环链表

就像上文所说的,我们让最后一个节点指向第一个节点,这样形成的链表就是一个循环链表,如下图所示:

php中链表的表现形式有哪些

关于循环的链表的操作我们不做详细的说明,其实大部分代码和单向链表是一样的,只是需要注意两个地方:

初始化、插入操作的时候,注意最后一个节点的指向,最后一个节点的 next 要指向第一个节点

判断链表遍历是否完成的条件为 item->next == head ,也就是说,判断这个节点的下一个节点如果是头节点的话,链表就遍历完成了。

双向链表

双向链表则是在 LinkedList 这个类里面增加一个属性来指向上一个节点。

// 双向链表class LinkedList{    public $data;    public $prev;    public $next;}

php中链表的表现形式有哪些

接下来,我们初始化一个双向链表。

function createLinkedList(){    $list = new LinkedList();    $list->data = null;    $list->next = null;    $list->prev = null; // ** 全部都初始化为 null **    return $list;}function Init(array $data){    // 初始化    $list = createLinkedList();    $r = $list;    foreach ($data as $key => $value) {        $link = new LinkedList();        $link->data = $value;        $link->next = null;        $r->next = $link;        $link->prev = $r; // ** 增加上级指向 **        $r = $link;    }    return $list;}$link = Init(range(1, 10));var_dump($link);var_dump($link->next->next->next->next);// object(LinkedList)#5 (3) {//     ["data"]=>//     int(4)//     ["prev"]=>//     object(LinkedList)#4 (3) {//       ["data"]=>//       int(3)//       ["prev"]=>//       object(LinkedList)#3 (3) {//         ["data"]=>//         int(2)//         ["prev"]=>//         object(LinkedList)#2 (3) {//           ["data"]=>//           int(1)//           ["prev"]=>//           object(LinkedList)#1 (3) {//             ["data"]=>//             NULL//             ["prev"]=>//             NULL//             ["next"]=>//             *RECURSION*//           }//           ["next"]=>//           *RECURSION*//         }//         ["next"]=>//         *RECURSION*//       }//       ["next"]=>//       *RECURSION*//     }//     ["next"]=>//     object(LinkedList)#6 (3) {//       ["data"]=>//       int(5)//       ["prev"]=>//       *RECURSION*//       ["next"]=>//       object(LinkedList)#7 (3) {//         ["data"]=>//         int(6)//         ["prev"]=>//         *RECURSION*//         ["next"]=>//         object(LinkedList)#8 (3) {//           ["data"]=>//           int(7)//           ["prev"]=>//           *RECURSION*//           ["next"]=>//           object(LinkedList)#9 (3) {//             ["data"]=>//             int(8)//             ["prev"]=>//             *RECURSION*//             ["next"]=>//             object(LinkedList)#10 (3) {//               ["data"]=>//               int(9)//               ["prev"]=>//               *RECURSION*//               ["next"]=>//               object(LinkedList)#11 (3) {//                 ["data"]=>//                 int(10)//                 ["prev"]=>//                 *RECURSION*//                 ["next"]=>//                 NULL//               }//             }//           }//         }//       }//     }//   }echo $link->next->next->next->next->data, PHP_EOL; // 4echo $link->next->next->next->next->prev->data, PHP_EOL; // 3

可以看出,与单向链表不同的地方就在于多增加了对于 prev 属性的操作。这里还是比较好理解的。直接打印链表会显示很多的 *RECURSION* 内容,这是 PHP 的一种输出的保护机制,这个标识说明当前这个属性变量是有递归类型的。

function Insert(LinkedList &$list, int $i, $data){    $j = 0;    $item = $list;    // 遍历链表,找指定位置的前一个位置    while ($j < $i - 1) {        $item = $item->next;        $j++;    }    // 如果 item 不存在或者 $i > n+1 或者 $i < 0    if ($item == null || $j > $i - 1) {        return false;    }    // 创建一个新节点    $s = new LinkedList();    $s->data = $data;    // 新创建节点的下一个节点指向原 i-1 节点的下一跳节点,也就是当前的 i 节点    $s->next = $item->next;    // ** 增加当前新创建的节点的上级指向 **    $s->prev = $item;    // 将 i-1 节点的下一跳节点指向 s ,完成将 s 插入指定的 i 位置,并让原来的 i 位置元素变成 i+1 位置    $item->next = $s;    // ** 将下级节点的 prev 指向新创建的这个节点 **    $s->next->prev = $s;    return true;}

链表的插入其实就是增加了两行代码,一个是当前新创建的节点的上级的指向,也就是将这个新节点的上级指定为 i-1 个节点。而另一个是将原来 i 位置节点的上级指向修改为当前新创建的这个节点。

function Delete(LinkedList &$list, int $i){    $j = 0;    $item = $list;    // 遍历链表,找指定位置的前一个位置    while ($j < $i - 1) {        $item = $item->next;        $j++;    }    // 如果 item 不存在或者 $i > n+1 或者 $i < 0    if ($item == null || $j > $i - 1) {        return false;    }    // 使用一个临时节点保存当前节点信息,$item 是第 i-1 个节点,所以 $item->next 就是我们要找到的当前这个 i 节点    $temp = $item->next;    // 让当前节点,也就是目标节点的上一个节点, i-1 的这个节点的下一跳(原来的 i 位置的节点)变成原来 i 位置节点的下一跳 next 节点,让i位置的节点脱离链条    $item->next = $temp->next;    // ** 让目标下一个节点的上级指针指向当前这个节点 **    $temp->next->prev = $item;    return true;}

与插入节点操作类似,删除节点操作除了将 i-1 个位置节点的数据的下一个节点的指向变为 i 节点的下一级节点的指向之外,还要将 i 的下一级节点的上级节点指向改为 i-1 节点。

其实,双向链表的定义和操作相比单向链表来说差别并不大,就是多了一个 prev 用来指向上一级节点而已,本质上也只是多了对于 prev 这个属性的操作而已。那么,多出来的这一个上级指针能带来什么好处呢?在遍历链表的时候,我们通过 prev ,就多了一种遍历方式,也就是反向的对链表进行遍历。在查找某个元素的时候,我们可以从两个方向同时进行查找,效率是不是一下子就提升了一倍。原来 O(n) 的时间复杂度瞬间可以变成 O(n/2) 的时间复杂度。

双向循环链表

最后,我们也简单的来介绍一下双向循环链表。顾名思义,它就是在双向链表的基础上加上循环链表的概念。让最后一个节点的 next 指向头节点,让头节点的 prev 指向最后一个节点。说起来容易但实现起来其实要复杂很多,因为你不仅要关注最后一个节点的下级节点指向问题,而且还要关注头节点的上级指向问题。所以在这里我们就不多做代码演示了,最主要的就是在插入和删除头、尾节点的时候需要多注意它们上下级节点的指向。

php中链表的表现形式有哪些

以上是“php中链表的表现形式有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

php中链表的表现形式有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

php中链表的表现形式有哪些

这篇文章主要介绍php中链表的表现形式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!循环链表就像上文所说的,我们让最后一个节点指向第一个节点,这样形成的链表就是一个循环链表,如下图所示:关于循环的链表的操作我们
2023-06-20

php的链表有哪些

这篇“php的链表有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php的链表有哪些”文章吧。在php中,链表是一种基础
2023-06-29

java中多态的表现形式有哪些

本篇文章给大家分享的是有关java中多态的表现形式有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编
2023-06-14

java多态的表现形式有哪些

Java多态的表现形式有以下几种:1. 方法重载:同一个类中,存在多个方法名相同但参数列表不同的方法,通过参数列表的不同来实现多态。2. 方法重写:父类和子类中有相同的方法名、相同的参数列表和相同的返回类型,子类可以重写父类的方法,通过父类
2023-09-23

PHP时间戳的表示形式有哪些

这篇“PHP时间戳的表示形式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP时间戳的表示形式有哪些”文章吧。10位
2023-07-05

在php中,字符串有哪些表示形式

php 字符串有 5 种表示形式:单引号忽略转义序列;双引号允许转义序列;heredoc 语法用于多行字符串并保留换行符;nowdoc 语法用于多行字符串但不保留换行符;反斜杠字符串可通过属性名访问对象属性。PHP 字符串表示形式PHP
在php中,字符串有哪些表示形式
2024-04-26

python中切片参数的表现形式有哪些

这篇文章将为大家详细讲解有关python中切片参数的表现形式有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.sc
2023-06-14

python的数据表示形式有哪些

本篇内容主要讲解“python的数据表示形式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python的数据表示形式有哪些”吧!程序的主要功能是处理数据。有许多数据。我们在手机和电脑上看到
2023-06-30

python列表的切片形式有哪些

这篇文章给大家分享的是有关python列表的切片形式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、切片形式(1)正向切片正向切片即使用正向索引,索引从0开始进行切片。(2)反向切片反向切片即使用反向索引
2023-06-15

Python中字符串表示形式有哪些

这期内容当中小编将会给大家带来有关Python中字符串表示形式有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无
2023-06-14

Java中链表题有哪些

这篇文章主要介绍了Java中链表题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。第一题 移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中
2023-06-21

有哪些链表的小技巧

本篇内容介绍了“有哪些链表的小技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!链表链表是数据结构里一个很基础但是又很爱考的线性结构,链表的
2023-06-16

php正则表达式有哪些

php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、"\s"、"\S"、"\b"、"*"、"+"、"?"、"{n}"
php正则表达式有哪些
2023-11-17

SQLite中的表达式有哪些

这篇“SQLite中的表达式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SQLite中的表达式有哪些”文章吧。SQL
2023-06-27

PHP 函数中的资源泄漏有什么表现形式?

资源泄漏的表现形式:内存泄漏死锁性能下降系统崩溃实战案例:php 函数 openfile 未关闭打开的文件,导致内存泄漏、性能下降和系统崩溃的风险。改进后的函数使用 finally 块在函数执行后显式关闭文件句柄,防止资源泄漏。PHP 函数
PHP 函数中的资源泄漏有什么表现形式?
2024-04-27

php表单提交的方式有哪些

PHP 表单提交的方式有以下几种:1. GET 方法:通过 URL 将表单数据以键值对的形式附加在 URL 之后,常用于获取资源或查询数据。2. POST 方法:将表单数据封装在 HTTP 请求的消息体中发送给服务器,常用于提交数据或执行敏
2023-08-11

Redis中快速表、压缩表和双向链表的区别有哪些

这篇文章主要介绍Redis中快速表、压缩表和双向链表的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言最近在看《Redis的设计与实现》这本书,写的真的是太好了,一下子就看入迷了,谢谢作者。不过在学习的时
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录