浅谈PHP链表数据结构(单链表)

介绍

链表是一种常见的数据结构,它包括单链表和双链表,本文中我们将会介绍PHP的单链表数据结构实现,具体而言我们将会实现一个包括插入节点,删除节点,打印节点等基本操作的单链表,帮助读者深入理解PHP链表数据结构。

创建节点

链表数据结构是由一个个节点组成的,我们首先要实现一个节点的创建函数,这个函数接受两个参数,一个是节点数据,另一个是下一个节点的指针地址。

/**
 * 定义节点类
 */
class ListNode {
    /**
     * 节点数据
     * @var mixed
     */
    public $val;

    /**
     * 下一个节点指针
     * @var ListNode
     */
    public $next;

    /**
     * 构造函数
     */
    public function __construct($val=0, $next=null) {
        $this->val = $val;
        $this->next = $next;
    }
}

插入节点

链表的插入操作分为在链表头插入和在链表尾插入两种情况。

在链表头插入节点

在链表头插入节点是在链表头部创建一个新的节点,然后将新节点的指针指向旧的头节点。实现这个功能时,我们需要维护一个头节点指针,这样才能在链表头插入数据。

下面是在链表头插入节点的代码示例:

/**
 * 在链表头插入数据
 * @param mixed $val 插入的数据
 */
public function addAtHead($val) {
    $node = new ListNode($val);
    $node->next = $this->head;
    $this->head = $node;
}

在链表尾插入节点

在链表尾部插入节点是一种比较常见的情况,我们需要将新节点的指针指向链表尾节点,然后将尾节点的指针指向新节点。为了实现尾插法,我们需要维护一个尾节点指针。

下面是在链表尾插入节点的代码示例:

/**
 * 在链表尾插入数据
 * @param mixed $val 插入的数据
 */
public function addAtTail($val) {
    $node = new ListNode($val);
    $node->next = null;

    if ($this->head == null) {
        $this->head = $node;
        return;
    }

    $pointer = $this->head;
    while ($pointer->next != null) {
        $pointer = $pointer->next;
    }

    $pointer->next = $node;
}

遍历链表

遍历链表是一种常见的操作,我们需要将头节点指针传递给一个临时指针变量,然后不断移动指针,直到指针为null。

下面是遍历链表的代码示例:

/**
 * 遍历链表
 */
public function printList() {
    $pointer = $this->head;
    while ($pointer != null) {
        echo $pointer->val . " -> ";
        $pointer = $pointer->next;
    }

    echo "NULL\n";
}

删除节点

链表中的删除节点操作有两种情况:

删除指定节点

删除指定节点是在链表中删除某个节点,我们需要将要删除节点的前一个节点的指针指向要删除节点的后一个节点。

/**
 * 删除指定节点
 * @param mixed $val 要删除节点的数据
 */
public function deleteNode($val) {
    $temp = new ListNode(0);
    $temp->next = $this->head;

    $pointer = $temp;
    while ($pointer->next != null) {
        if ($pointer->next->val == $val) {
            $pointer->next = $pointer->next->next;
            break;
        }

        $pointer = $pointer->next;
    }

    $this->head = $temp->next;
}

删除第N个节点

删除链表中第N个节点是一个比较复杂的操作,需要我们维护前一个节点的指针。在实现这个操作时,我们需要先遍历链表,获取第N个节点前一个节点的指针,然后将这个指针指向第N个节点的下一个节点。

下面是删除链表中第N个节点的代码示例:

/**
 * 删除链表中第N个节点
 * @param int $n 删除的节点下标
 */
public function deleteAtIndex($n) {
    $temp = new ListNode(0);
    $temp->next = $this->head;

    $pointer = $temp;
    for ($i = 0; $i < $n; $i++) {
        $pointer = $pointer->next;
    }

    $pointer->next = $pointer->next->next;
    $this->head = $temp->next;
}

示例说明

下面为您提供两个实例,帮助您更好的理解链表相关操作的实现。

示例一:打印链表

$list = new LinkedList();
$list->addAtHead(3);
$list->addAtHead(5);
$list->addAtTail(8);
$list->printList();

上面的代码将会输出:5 -> 3 -> 8 -> NULL

示例二:删除链表中第2个节点

$list = new LinkedList();
$list->addAtHead(3);
$list->addAtHead(5);
$list->addAtTail(8);
$list->deleteAtIndex(1);
$list->printList();

上面的代码将会输出:5 -> 8 -> NULL

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP链表数据结构(单链表) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • java数据结构基础:稀疏数组

    Java数据结构基础:稀疏数组 在开发过程中,我们需要处理一些稀疏矩阵(大部分元素为0)的数据。这时候,使用稀疏数组是比较高效的方法。 什么是稀疏数组 稀疏数组是由很多元素值相同的元素组成,这些元素的值通常为0。而这些值不同时都存储在一个数组中会浪费很多内存空间。因此,我们使用稀疏数组来存储这些元素。 稀疏数组的定义: 稀疏数组的行数可以理解为矩阵的行数,而…

    数据结构 2023年5月17日
    00
  • C++线性表深度解析之动态数组与单链表和栈及队列的实现

    C++线性表深度解析之动态数组与单链表和栈及队列的实现 动态数组的实现 动态数组是一种可以动态扩展的数组结构,它的容量可以随着需要而动态增加。在C++中,使用vector类可以实现动态数组的功能。vector类相当于动态分配了一块内存空间,在使用时可以根据需要进行动态扩展。下面是一个示例代码: #include <vector> #include…

    数据结构 2023年5月17日
    00
  • Unity接入高德开放API实现IP定位

    Unity接入高德开放API实现IP定位攻略 本文将详细介绍如何在Unity中接入高德开放API实现IP定位功能。 准备工作 在开始之前,需要准备以下内容: 高德开放平台账号 Unity集成开发环境 一台联网的电脑或手机 开始集成 1. 创建Unity项目 首先,我们需要在Unity中创建一个新的项目。 2. 导入AMap3D SDK 将下载好的AMap3D…

    数据结构 2023年5月17日
    00
  • Java 详细分析四个经典链表面试题

    Java 详细分析四个经典链表面试题 简介 链表是数据结构中非常常见的一种形式,在Java中也有非常多的实现方式。本文将介绍Java中四个经典的链表面试题,并且详细分析它们的实现方法。在介绍每一个题目的详细实现之前,我们将简单介绍Java链表和链表常见操作。 Java链表 链表是一种线性结构,其中每个节点包含了一个数据域和一个指针域,指向下一个节点。Java…

    数据结构 2023年5月17日
    00
  • C++抽象数据类型介绍

    C++抽象数据类型介绍 什么是抽象数据类型? 抽象数据类型(Abstract Data Type,ADT),是数据类型的一个数学模型。它实现了数据类型的抽象过程,将数据与操作分离,使得操作具有独立性,而数据只作为函数参数和返回值存在。 举个例子,ADT可以定义一个栈(Stack),栈的实现需要以下操作: 初始化栈 压入数据 弹出数据 获取栈顶数据 检查栈是否…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟攻略 背景介绍 银行模拟是计算机学科中一个重要的数据结构实践练习项目。它涉及到队列(Queue)等数据结构的应用,也是计算机基础课程的一个重要组成部分。 代码实现 1. 队列的实现 首先,我们需要实现一个队列(Queue)结构体,包含 QueueSize、Front、Rear 三个成员变量: struct Queue { int Q…

    数据结构 2023年5月17日
    00
  • 设要采用CRC编码传送的数据信息x=1001,当生成多项式为G(x)=1101时,请写出它的循环校验码。若接收方收到的数据信息x’ =1101,说明如何定位错误并纠正错误

    题目:设要采用CRC编码传送的数据信息x=1001,当生成多项式为G(x)=1101时,请写出它的循环校验码。若接收方收到的数据信息x’ =1101,说明如何定位错误并纠正错误 根据题目描述,需要采用CRC编码对数据信息x=1001进行编码,生成多项式为G(x)=1101。下面是计算循环冗余校验码的步骤:1.首先将数据信息x乘以x的次数,使得它的位数与G(x…

    算法与数据结构 2023年4月18日
    00
  • MySQL高级篇之索引的数据结构详解

    MySQL高级篇之索引的数据结构详解 索引的作用 索引是一种数据结构,用于快速地定位和访问数据表中的指定行。MySQL中索引通常以B-tree(B树)或哈希表的形式来实现,通过将索引存储在内存中,可以提高系统的查询效率。 常用的索引分为主键索引、唯一索引和普通索引。其作用分别为: 主键索引:保证表中每一行数据的唯一性,便于快速查询和修改数据。 唯一索引:保证…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部