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

yizhihongxing

介绍

链表是一种常见的数据结构,它包括单链表和双链表,本文中我们将会介绍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语言中数据结构与算法之链表。接下来,将从以下几个方面为大家讲述: 链表的定义 链表的特点 链表的分类 单向链表的实现及应用 双向链表的实现及应用 示例说明 1. 链表的定义 链表是由一系列节点组合而成的数据结构,每个节点都包含了一个数据域和一个指向下一个节点的指针域。其中,链表的头结点为第一个节点,而尾节点为最后一个节…

    数据结构 2023年5月17日
    00
  • C++实现KDTree 附完整代码

    对于“C++实现KDTree 附完整代码”的攻略,我会分为以下几个部分进行讲解: KDTree的基本概念和算法原理 KDTree的实现思路和整体代码结构 KDTree在实际应用中的应用场景 两个示例应用说明 KDTree基本概念和算法原理 KDTree全称是K-Dimensional Tree,即K维树,是一种便于高维空间数据检索的数据结构。其基本思路是对于…

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

    Python数据结构之链表详解 链表简介 链表是一种数据结构,其每个节点都包含一个指向下一个节点的指针。链表可以用来表示序列,集合或映射等数据结构。在Python中,链表通常由节点和链表类来实现。 单向链表 单向链表是一种链表,每个节点包含指向下一个节点的指针。在Python中,一个节点可以由一个简单的对象表示,而整个链表必须由相互链接的节点组成。 下面是一…

    数据结构 2023年5月17日
    00
  • C语言线性表的顺序表示与实现实例详解

    C语言线性表的顺序表示与实现实例详解 1. 线性表的定义 线性表是一种线性结构,它是由n个数据元素(n≥0)组成的有限序列。当n=0时,我们称为一个空表。 在C语言中,我们可以通过数组来实现线性表的顺序表示,每个数据元素都存在数组的一个位置中,数组下标可以看作是该数据元素的位置。 2. 线性表的基本操作 一个线性表的基本操作有以下几种: 2.1 初始化线性表…

    数据结构 2023年5月17日
    00
  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘一

    C#数据结构与算法揭秘 准备工作 首先,需要在电脑上安装好Visual Studio开发环境。然后,从官网下载并安装书籍代码和演示程序。代码和示例程序都是基于.NET Framework 4.5.1平台,所以需要该版本或以上的.NET Framework。 第一章:初识数据结构和算法 该章节介绍了数据结构和算法的概念、学习数据结构和算法的重要性、以及该书的学…

    数据结构 2023年5月17日
    00
  • C语言数据结构之栈和队列的实现及应用

    C语言数据结构之栈和队列的实现及应用 什么是栈和队列? 栈是一种具有后进先出(LIFO)特性的线性数据结构,可以理解为一个只能在一端进行插入和删除操作的数据结构。通常称插入元素的一端为栈顶,删除元素的一端为栈底。 队列是一种具有先进先出(FIFO)特性的线性数据结构,可以理解为一个只能在两端进行插入和删除操作的数据结构。一端进行插入操作,称之为队尾,一端进行…

    数据结构 2023年5月17日
    00
  • java实现数据结构单链表示例(java单链表)

    下面是 Java 实现数据结构单链表的完整攻略。 简介 单链表是数据结构中的一种,用于存储一组有序的元素。单链表中,每个元素都由一个结点表示,结点中包含了一个指向下一个结点的指针。单链表的结构更加灵活,支持插入、删除等操作。 实现步骤 1. 定义节点类ListNode 单链表的每一个节点包含两个属性,分别是节点值 val 和指向下一个节点的指针 next,所…

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