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日

相关文章

  • mysql去重的方法整理

    以下是“MySQL去重的方法整理”的完整攻略: 1. 去重的概念 在MySQL中,去重是指从查询结果中删除重复的行。当查询结果包含多个相同的行时,去重可以帮助我们只显示一次这些行,从而使查询结果更加简洁和易读。 2. MySQL去重的方法 MySQL提供了多种去重的方法,包括使用DISTINCT关键字、GROUP BY子句和HAVING子句等。下面分别介绍这…

    other 2023年5月8日
    00
  • surfaceview使用详解

    SurfaceView 使用详解 SurfaceView 是 Android 中一个很实用的UI控件,它可以让我们在一个单独的线程中绘制复杂的图形,例如视频、动画等等。这里就来详细介绍一下 SurfaceView 的使用。 SurfaceView 的基本用法 首先,需要在 xml 文件中定义一个 SurfaceView 控件: <android.vie…

    其他 2023年3月28日
    00
  • Android中使用ScrollView实现滑动到底部显示加载更多

    当在Android应用中需要实现滑动到底部时加载更多数据的功能时,可以使用ScrollView来实现。下面是使用ScrollView实现滑动到底部加载更多的完整攻略: 首先,在XML布局文件中定义一个ScrollView,并在其中添加一个垂直方向的线性布局(LinearLayout)作为ScrollView的子视图。这个线性布局将用于显示所有的数据项。 &l…

    other 2023年8月25日
    00
  • 微信小程序全局配置及常用配置项详解

    微信小程序全局配置及常用配置项详解 什么是微信小程序配置文件 每个微信小程序都需要一个配置文件app.json。这个文件用来对小程序进行一些全局性的配置,例如设置页面路径、窗口背景色、顶部条颜色等等,而且这些配置无论在哪个页面都能生效。 app.json配置文件结构 一个app.json文件包括了整个小程序的全局配置,是一个全局性的配置文件,不需要放在pag…

    other 2023年6月25日
    00
  • React优雅的封装SvgIcon组件示例

    让我详细讲解一下“React优雅的封装SvgIcon组件示例”的完整攻略。 什么是SvgIcon组件 SVG 是一种基于 XML 语言的矢量图形。在 web 中,SVG 图形可以通过一组 SVG 标记和属性来定义。SvgIcon 组件是一种常见的 React 组件,它可以用于在网站中使用 SVG 图标。 通常情况下,我们需要在网站中使用很多的 SVG 图标。…

    other 2023年6月25日
    00
  • 什么是操作系统

    什么是操作系统? 操作系统(Operating System,简称 OS)是一种控制计算机硬件和软件资源的程序集合,它是计算机系统中最基本的系统软件。操作系统提供了操作计算机所必须的各种服务,如用户管理、内存管理、文件管理、进程管理、设备管理等等。 操作系统的功能 按照常见的分类方式,操作系统具有以下主要功能: 进程管理:进程是计算机中正在执行的程序实例,在…

    其他 2023年4月16日
    00
  • laravel5.4生成验证码的代码

    生成验证码是许多 Web 应用的常见需求,在 Laravel 5.4 中也提供了相应的支持。 一、安装依赖 在开始前,需要安装 simple-qrcode 依赖,该依赖可以用于生成二维码。可以通过以下 composer 命令进行安装: composer require simplesoftwareio/simple-qrcode 二、生成验证码 1. 基本操…

    other 2023年6月27日
    00
  • androidbutton点击效果(按钮背景变色、文字变色)

    以下是Android中实现按钮点击效果(按钮背景变色、文字变色)的完整攻略,包括以下步骤: 创建按钮 创建selector文件 设置按钮背景 设置按钮文字颜色 示例说明 步骤一:创建按钮 在实现按钮点击效果之前,需要先创建一个按钮。以下是创建按钮的步骤: 在XML布局文件中添加Button控件,例如: <Button android:id="…

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