iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php中链表的表现形式有哪些
  • 576
分享到

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

2023-06-20 18:06:47 576人浏览 独家记忆
摘要

这篇文章主要介绍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中链表的表现形式有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: php中链表的表现形式有哪些

本文链接: https://www.lsjlt.com/news/298878.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • php中链表的表现形式有哪些
    这篇文章主要介绍php中链表的表现形式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!循环链表就像上文所说的,我们让最后一个节点指向第一个节点,这样形成的链表就是一个循环链表,如下图所示:关于循环的链表的操作我们...
    99+
    2023-06-20
  • php的链表有哪些
    这篇“php的链表有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php的链表有哪些”文章吧。在php中,链表是一种基础...
    99+
    2023-06-29
  • CSS的Hack表现形式有哪些
    这篇文章主要讲解了“CSS的Hack表现形式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS的Hack表现形式有哪些”吧!摘要: &nb...
    99+
    2024-04-02
  • java中多态的表现形式有哪些
    本篇文章给大家分享的是有关java中多态的表现形式有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编...
    99+
    2023-06-14
  • java多态的表现形式有哪些
    Java多态的表现形式有以下几种:1. 方法重载:同一个类中,存在多个方法名相同但参数列表不同的方法,通过参数列表的不同来实现多态。...
    99+
    2023-09-23
    java
  • PHP时间戳的表示形式有哪些
    这篇“PHP时间戳的表示形式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP时间戳的表示形式有哪些”文章吧。10位...
    99+
    2023-07-05
  • 在php中,字符串有哪些表示形式
    php 字符串有 5 种表示形式:单引号忽略转义序列;双引号允许转义序列;heredoc 语法用于多行字符串并保留换行符;nowdoc 语法用于多行字符串但不保留换行符;反斜杠字符串可通...
    99+
    2024-04-26
  • python中切片参数的表现形式有哪些
    这篇文章将为大家详细讲解有关python中切片参数的表现形式有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.sc...
    99+
    2023-06-14
  • python的数据表示形式有哪些
    本篇内容主要讲解“python的数据表示形式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python的数据表示形式有哪些”吧!程序的主要功能是处理数据。有许多数据。我们在手机和电脑上看到...
    99+
    2023-06-30
  • python列表的切片形式有哪些
    这篇文章给大家分享的是有关python列表的切片形式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、切片形式(1)正向切片正向切片即使用正向索引,索引从0开始进行切片。(2)反向切片反向切片即使用反向索引...
    99+
    2023-06-15
  • Python中字符串表示形式有哪些
    这期内容当中小编将会给大家带来有关Python中字符串表示形式有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无...
    99+
    2023-06-14
  • Java中链表题有哪些
    这篇文章主要介绍了Java中链表题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。第一题 移除链表元素给你一个链表的头节点 head 和一个整数 val ,请你删除链表中...
    99+
    2023-06-21
  • 在HTML5中被废弃的列表形式有哪些
    小编给大家分享一下在HTML5中被废弃的列表形式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • CSS中Hack表现形式有几种
    这篇文章主要介绍了CSS中Hack表现形式有几种,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是CSS hack由于不同厂商的流览器或某...
    99+
    2024-04-02
  • 有哪些链表的小技巧
    本篇内容介绍了“有哪些链表的小技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!链表链表是数据结构里一个很基础但是又很爱考的线性结构,链表的...
    99+
    2023-06-16
  • php正则表达式有哪些
    php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、"\s"、"\S"、"\b"、"*"、"+"、""、"{n}"、...
    99+
    2023-11-17
    php PHP正则表达式
  • 在 PHP 中实现链表
    本文将介绍 PHP 中链表的实现。使用 SplDoublyLinkedList 类在 PHP 中实现链表链表是在许多编程语言中实现的常见数据结构。它是线性的,包含相互链接的节点。每个节点都包含数据和到相邻节...
    99+
    2024-02-27
  • PHP 函数中的资源泄漏有什么表现形式?
    资源泄漏的表现形式:内存泄漏死锁性能下降系统崩溃实战案例:php 函数 openfile 未关闭打开的文件,导致内存泄漏、性能下降和系统崩溃的风险。改进后的函数使用 finally 块在...
    99+
    2024-04-27
    php 资源泄漏
  • jmeter图形图表有哪些
    这篇文章主要讲解了“jmeter图形图表有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jmeter图形图表有哪些”吧!1 前言图表图形类分析元件2 Jmeter结果分析之各种...
    99+
    2023-06-05
  • SQLite中的表达式有哪些
    这篇“SQLite中的表达式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SQLite中的表达式有哪些”文章吧。SQL...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作