PHP实现链表的定义与反转功能示例

yizhihongxing

下面我将详细讲解“PHP实现链表的定义与反转功能示例”的完整攻略,过程中将包含两条示例说明。

什么是链表

链表是一种常见的数据结构,它由多个节点组成,每个节点存储了数据和指向下一个节点的指针。相比于数组,链表的插入和删除效率更高,但访问操作的效率较低。

PHP实现链表的定义

在PHP中,我们可以使用类来实现链表。首先,我们需要定义一个节点类,代码如下:

class ListNode {
    public $val; // 当前节点的值
    public $next; // 指向下一个节点的指针

    public function __construct($val = 0, $next = null) {
        $this->val  = $val;
        $this->next = $next;
    }
}

接下来,我们可以定义整个链表的类,代码如下:

class LinkedList {
    private $dummyHead; // 虚拟头节点
    private $size; // 链表长度

    public function __construct() {
        $this->dummyHead = new ListNode();
        $this->size      = 0;
    }

    // 获取链表中的元素个数
    public function getSize() {
        return $this->size;
    }

    // 判断链表是否为空
    public function isEmpty() {
        return $this->size == 0;
    }

    // 在链表的第index个位置添加新的元素e
    public function add($index, $e) {
        if ($index < 0 || $index > $this->size) {
            throw new InvalidArgumentException('Add failed. Index is invalid.');
        }

        $prev = $this->dummyHead;
        for ($i = 0; $i < $index; $i++) {
            $prev = $prev->next;
        }

        $prev->next = new ListNode($e, $prev->next);
        $this->size++;
    }

    // 在链表头添加新的元素e
    public function addFirst($e) {
        $this->add(0, $e);
    }

    // 在链表末尾添加新的元素e
    public function addLast($e) {
        $this->add($this->size, $e);
    }

    // 获取链表的第index个位置的元素
    public function get($index) {
        if ($index < 0 || $index >= $this->size) {
            throw new InvalidArgumentException('Get failed. Index is invalid.');
        }

        $cur = $this->dummyHead->next;
        for ($i = 0; $i < $index; $i++) {
            $cur = $cur->next;
        }

        return $cur->val;
    }

    // 获取链表的第一个元素
    public function getFirst() {
        return $this->get(0);
    }

    // 获取链表的最后一个元素
    public function getLast() {
        return $this->get($this->size - 1);
    }

    // 修改链表的第index个位置的元素为e
    public function set($index, $e) {
        if ($index < 0 || $index >= $this->size) {
            throw new InvalidArgumentException('Set failed. Index is invalid.');
        }

        $cur = $this->dummyHead->next;
        for ($i = 0; $i < $index; $i++) {
            $cur = $cur->next;
        }

        $cur->val = $e;
    }

    // 查找链表中是否存在元素e
    public function contains($e) {
        $cur = $this->dummyHead->next;
        while ($cur != null) {
            if ($cur->val == $e) {
                return true;
            }
            $cur = $cur->next;
        }

        return false;
    }

    // 从链表中删除第index个元素,返回删除的元素
    public function remove($index) {
        if ($index < 0 || $index >= $this->size) {
            throw new InvalidArgumentException('Remove failed. Index is invalid.');
        }

        $prev = $this->dummyHead;
        for ($i = 0; $i < $index; $i++) {
            $prev = $prev->next;
        }

        $ret         = $prev->next;
        $prev->next  = $ret->next;
        $ret->next   = null; // 方便回收内存
        $this->size--;

        return $ret->val;
    }

    // 从链表中删除第一个元素,返回删除的元素
    public function removeFirst() {
        return $this->remove(0);
    }

    // 从链表中删除最后一个元素,返回删除的元素
    public function removeLast() {
        return $this->remove($this->size - 1);
    }

    // 删除链表中值为e的元素
    public function removeElement($e) {
        $prev = $this->dummyHead;
        while ($prev->next != null) {
            if ($prev->next->val == $e) {
                $delNode     = $prev->next;
                $prev->next  = $delNode->next;
                $delNode->next = null; // 方便回收内存
                $this->size--;
            } else {
                $prev = $prev->next;
            }
        }
    }

    // 反转链表
    public function reverse() {
        $prev = null;
        $curr = $this->dummyHead->next;
        while ($curr != null) {
            $next        = $curr->next;
            $curr->next  = $prev;
            $prev        = $curr;
            $curr        = $next;
        }

        $this->dummyHead->next = $prev;
    }

    // 打印链表
    public function __toString() {
        $sb  = '';
        $cur = $this->dummyHead->next;
        while ($cur != null) {
            $sb .= $cur->val . '->';
            $cur = $cur->next;
        }
        $sb .= 'NULL';

        return $sb;
    }
}

PHP实现链表反转的示例

接下来,我将演示如何使用上面实现的链表类进行反转操作。

示例一

$list = new LinkedList();
$list->addLast(1);
$list->addLast(2);
$list->addLast(3);
$list->addLast(4);
echo $list . PHP_EOL;

// 反转链表
$list->reverse();
echo $list . PHP_EOL;

输出结果:

1->2->3->4->NULL
4->3->2->1->NULL

示例二

$list = new LinkedList();
$list->addLast('a');
$list->addLast('b');
$list->addLast('c');
$list->addLast('d');
$list->addLast('e');
echo $list . PHP_EOL;

// 反转链表
$list->reverse();
echo $list . PHP_EOL;

输出结果:

a->b->c->d->e->NULL
e->d->c->b->a->NULL

以上就是如何在PHP中实现链表的定义和反转操作的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现链表的定义与反转功能示例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • MySQL5.7免安装版配置图文教程

    下面是详细的MySQL5.7免安装版配置攻略: 准备工作 下载MySQL5.7免安装版的压缩包,并解压到指定目录下; 加入MySQL的bin目录到系统的环境变量PATH中; 创建MySQL数据目录,并授权给MySQL用户。 配置MySQL 创建my.ini配置文件,内容如下: [mysqld] basedir=C:/mysql-5.7.31-winx64 d…

    other 2023年6月27日
    00
  • 【图文】迅雷会员钻石子账号怎么设置?

    【图文】迅雷会员钻石子账号怎么设置? 什么是迅雷会员钻石子账号? 迅雷会员钻石子账号是指开通迅雷会员之后,可以给家人或朋友赠予开通会员的子账号。子账号可以独立开通和管理会员,享受会员权益,但子账号的开通费用由主账号支付。 如何设置迅雷会员钻石子账号? 步骤如下: 登录迅雷会员账号,进入“个人中心”页面。 点击左侧菜单栏中的“子账号管理”。 点击“创建子账号”…

    other 2023年6月27日
    00
  • 6.(转载)SSRF漏洞挖掘经验

    6. (转载) SSRF漏洞挖掘经验 本文将分享一些SSRF漏洞挖掘的经验和技巧。SSRF漏洞是一种在Web应用中广泛存在的安全漏洞,攻击者可以利用它来发起内网扫描、攻击内部系统等。 什么是SSRF漏洞? SSRF全称Server-Side Request Forgery(服务端请求伪造)漏洞,简单来说,就是Web应用程序中的一个安全漏洞,攻击者可以利用它来…

    其他 2023年3月28日
    00
  • redhat9.0下载地址

    Red Hat 9.0 下载地址攻略 Red Hat 9.0 是一个古老的 Linux 发行版,但如果你有特定的需求或者对历史版本感兴趣,你可能想要下载它。在这个攻略中,我将为你提供 Red Hat 9.0 的下载地址,并提供两个示例说明。 步骤一:访问官方网站 首先,你需要访问 Red Hat 官方网站以获取 Red Hat 9.0 的下载地址。你可以在以…

    other 2023年8月4日
    00
  • 如何使用processon制作思维导图

    如何使用ProcessOn制作思维导图 思维导图是一种常用的知识整理工具,可以方便地将复杂的思路整理成清晰可见的图形。而ProcessOn是一款免费、易用的思维导图工具,以下是使用ProcessOn制作思维导图的详细步骤。 步骤一:注册帐号 访问ProcessOn官网(https://www.processon.com/)后,点击右上角的“注册”按钮,填写邮…

    其他 2023年3月28日
    00
  • js生成word中图片处理

    下面是 JS 生成 Word 中图片处理的完整攻略,包括图片处理的基本原理、常见问题和两个示例说明。 图片处理的基本原理 在 JS 中生成 Word 文档时,如果需要插入图片,需要对图片进行处理。图片处理的基本原理包括以下几个方面: 图片转换 JS 中的图片通常是以 base64 编码的字符串形式存在的,需要将其转换为 Word 中的图片格式,如 JPEG、…

    other 2023年5月5日
    00
  • C++将字符串格式化的几种方式总结

    C++将字符串格式化的几种方式总结 在C++中,将字符串格式化的操作是一项非常常见、重要的任务,可以帮助我们将各种类型的数据转换为字符串,以方便输出或者存储。本文将总结C++中字符串格式化的几种方式,并提供相应的示例说明。 1. 字符串流 字符串流是C++ STL中的一个重要组成部分,可以通过头文件中的stringstream来实现。我们可以将各种类型的数据…

    other 2023年6月20日
    00
  • ads(armdevelopersuite)安装与卸载中的问题

    ADS(ARM Developer Suite)安装与卸载中的问题 ADS(ARM Developer Suite)是一款ARM嵌入式开发工具,可用于开发和调试ARM处理器的应程序。在安装和卸载ADS时,可能会遇到些问题。本文将详细介绍ADS安装和卸载中的问题,并提供两个示例说明。 1. ADS安装中的问题 以下是ADS安装中可能遇到的问题: 1.1 安装程…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部