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

下面我将详细讲解“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日

相关文章

  • delphi2010安装及调试

    以下是“Delphi2010安装及调试”的完整攻略: Delphi2010安装及调试 Delphi是一款流行的集成开发环境(IDE),用于开发Windows应用程序。在本攻略中,我们将介绍如何安装Delphi2010,并进行调试。 步骤1:下载Delphi2010安装程序 在开始安装Delphi2010之前,您需要下载Delphi2010安装程序。您可以Em…

    other 2023年5月7日
    00
  • C语言深入了解自定义数据类型的使用

    C语言深入了解自定义数据类型的使用攻略 1. 自定义数据类型的定义 在C语言中,可以通过 typedef 关键字来定义自定义数据类型。定义的语法格式如下: typedef 原类型名 自定义类型名; 下面是一个简单的示例: typedef int INT; 上面的代码定义了一个名为 INT 的新类型,其实质就是 int 类型的别名。 2. 自定义数据类型的使用…

    other 2023年6月25日
    00
  • Sybase:循环调用存储过程

    Sybase:循环调用存储过程的完整攻略 在Sybase中,存储过程是一种常用的操作数据的方式。有时候需要在存储过程中循环调用另一个存储过程,以实现一些特定的功能。本文将为您提供一份Sybase:循环调用存储过程的完整攻略,包括两个示例说明。 循环调用存储过程 在Sybase中,可以按照以下步骤循环调用存储过程: 创建存储过程:创建需要循环调用的存储过程。 …

    other 2023年5月5日
    00
  • latex如何将文字标红

    当然,我可以为您提供有关“LaTeX如何将文字标红”的完整攻略,以下是详细说明: LaTeX如何将文字标红 在LaTeX中,可以使用\textcolor命令将文字标红。以下是详细步骤: 导入xcolor宏包 在LaTeX代码中,需要导入xcolor宏包。 latex \usepackage{xcolor} 使用\textcolor命令 在LaTeX代码中,可…

    other 2023年5月7日
    00
  • 40多个漂亮的网页表单设计实例

    首先,在讲解“40多个漂亮的网页表单设计实例”的完整攻略之前,我们需要了解一些基础知识。 Markdown 是一种轻量级标记语言,它可以让文档更加易读、易写、易更改。同时,也支持格式化文本、图片、代码、链接等多种格式。在编写 markdown 文本时,可以使用多种语法来表达不同的格式。比如: 标题1 标题2 标题3 代码块 斜体 加粗 链接 了解了基础知识之…

    other 2023年6月26日
    00
  • oracle数据库中日期时间的插入操作

    Oracle数据库中日期时间的插入操作 在Oracle数据库中,日期时间类型是一种非常重要的数据类型。在进行插入数据操作时,正确地插入日期时间数据,会对后续的数据统计和分析产生重要作用。因此,本文将介绍如何在Oracle数据库中正确地插入日期和时间数据。 插入日期 在Oracle中,日期数据类型为DATE,可以存储年、月、日、时、分、秒以及大约1/100秒的…

    其他 2023年3月29日
    00
  • openstack使用openvswitch实现vxlan的方法

    OpenStack使用OpenvSwitch实现Vxlan的方法 在虚拟化技术中,OpenStack被广泛使用。OpenvSwitch是一个虚拟交换机,它是OpenStack中最受欢迎的交换机类型之一。VXLAN(Virtual Extensible LAN)是一种虚拟局域网技术,它允许在不同的数据中心之间创建二层网络的扩展连接。在本文中,我们将讨论使用Op…

    其他 2023年3月28日
    00
  • Go底层channel实现原理及示例详解

    Go底层channel实现原理及示例详解 介绍 Go是一门并发编程语言,其核心思想通过Goroutine和Channel实现轻量级并发。本文将详细讲解Go底层Channel实现原理,并提供两个示例说明。 Channel概述 Go中的Channel是一种实现同步、通信和控制Goroutine的途径,类似于Unix中的管道。它可以让不同的Goroutine之间进…

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