浅谈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日

相关文章

  • C++抽象数据类型介绍

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

    数据结构 2023年5月17日
    00
  • Java数据结构之栈与队列实例详解

    Java数据结构之栈与队列实例详解攻略 简介 栈和队列是常见的数据结构,在Java中也有对应的实现方式。本文将介绍栈和队列的概念、常见实现方式、应用场景和两个示例。 栈 概念 栈是一种具有后进先出(Last In First Out)特性的数据结构。栈可以使用数组或链表实现。 常见实现方式 基于数组的栈实现 使用数组作为底层存储结构实现栈时,需要注意栈顶指针…

    数据结构 2023年5月17日
    00
  • C语言 结构体数组详解及示例代码

    C语言 结构体数组详解及示例代码 结构体是C语言中最为基础的数据结构之一,它可以将多个数据类型组合成一个整体,方便地进行访问和管理。而结构体数组则是将多个相同结构体类型的变量按照一定规律排列在一起的一种数据结构。本文将详细讲解C语言中结构体数组的使用方法及示例代码。 定义结构体 首先,我们需要定义一个结构体类型。结构体类型需要指定名称、成员变量及其数据类型:…

    数据结构 2023年5月17日
    00
  • js实现无限层级树形数据结构(创新算法)

    要实现无限层级树形数据结构,可以使用递归算法来解决。以下是该过程的详细攻略: 步骤1:准备数据 为了演示无限层级树形结构,我们需要准备一组具有父子关系的数据。数据可以是任何格式,例如在子对象节点下添加一个名为children的数组即可。 例如,假设我们有以下数据: const data = [ { id: 1, name: "Node 1&quot…

    数据结构 2023年5月17日
    00
  • 京东LBS推荐算法实践

    作者:京东零售 郑书剑 1、推荐LBS业务介绍 1.1 业务场景 现有的同城购业务围绕京东即时零售能力搭建了到店、到家两种业务场景。同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主站复访复购频次,是零售的重要战略方向。 1.2 名词解释 LBS:基于位置的服务(Location Based Services)。 下文LBS商品代指京东小时…

    算法与数据结构 2023年4月17日
    00
  • JavaScript队列数据结构详解

    JavaScript队列数据结构详解 本文将为大家详细讲解JavaScript队列数据结构的相关知识。 什么是队列数据结构 队列是一种线性数据结构,它只允许在队列的两端进行插入和删除操作。在队列中,新元素插入到队列的末尾,也称为队尾。而删除操作则是从队列的前面删除元素,也称为队首。 将元素插入队列的操作称为入队,将元素删除队列的操作称为出队。除此之外,还有一…

    数据结构 2023年5月17日
    00
  • C++数据结构之链表的创建

    C++中链表的创建一般可分为以下几个步骤: 创建节点结构体 创建链表类,定义私有变量头结点(head)和一些公有方法,如插入、删除和打印链表等 实现链表的插入、删除和打印方法 下面将会对以上每个步骤进行详细讲解。 1. 创建节点结构体 节点结构体包含两个部分,一个是存储数据的变量,另一个是存储指向下一个节点的指针。代码如下: struct Node { in…

    数据结构 2023年5月17日
    00
  • Python数据结构之翻转链表

    对于“Python数据结构之翻转链表”的完整攻略,我会按照以下顺序进行讲解: 1.什么是链表? 2.如何翻转链表? 3.示例1:翻转一个简单的链表 4.示例2:翻转一个带环的链表 5.如何在Python中实现翻转链表? 接下来,我会详细讲解每个部分。 什么是链表? 链表是一种数据结构,它由一系列的节点组成,每个节点包含了数据和指向下一个节点的指针。链表有很多…

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