浅谈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语言多维数组数据结构的实现详解 多维数组的定义 多维数组是由若干行和若干列构成的数据类型,它由多个一维数组组成。在C语言中,多维数组的定义和一维数组十分相似,只是在数组定义中增加了方括号以表示维数。 下面是一个二维数组的定义: int arr[3][4]; 上述代码定义了一个3行4列的二维数组,标识符为arr,它包含12个元素。其中arr[0][0]到ar…

    数据结构 2023年5月17日
    00
  • C++数据结构之二叉搜索树的实现详解

    C++数据结构之二叉搜索树的实现详解 1. 什么是二叉搜索树? 二叉搜索树是一种二叉树,其中每个节点都包含一个键值,且每个节点的键值都大于其左子树中任何节点的键值,小于其右子树中任何节点的键值。如下图所示: 9 / \ 4 15 / \ 12 20 在上面的二叉搜索树中,节点的键值分别是9, 4, 15, 12, 20,且每个节点的键值都符合上述定义。 2.…

    数据结构 2023年5月17日
    00
  • golang中set数据结构的使用示例

    Golang中Set数据结构的使用示例 Set是一种无序的、元素不重复的数据结构。通过使用map来实现,map中的key即为Set中的元素,value则可以用来存储某种状态(比如计数)。 Set数据结构的定义 type Set struct { m map[interface{}]bool } Set数据结构的初始化 func NewSet() *Set {…

    数据结构 2023年5月17日
    00
  • C++如何实现BitMap数据结构

    下面我将详细讲解C++如何实现BitMap数据结构的完整攻略,包含以下几个方面: 什么是BitMap数据结构 如何使用C++实现BitMap数据结构 BitMap数据结构的应用示例说明 1. 什么是BitMap数据结构 BitMap数据结构也叫位图,是一种非常简单而高效的数据结构,它主要是用来对大量数字进行存储和操作的。所谓BitMap,就是将一个数字序列通…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解 希尔排序简介 希尔排序,也称为缩小增量排序,是插入排序的一种更高效的改进版本;希尔排序是非稳定排序算法。 希尔排序的基本思想是已距离进行“减半”的插入排序;先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待各子序列中的记录基本有序时,再将子序列合并为整体有序序列。 希尔排序的过程 从上面的简介中我们可以得…

    数据结构 2023年5月17日
    00
  • Java数据结构之List的使用总结

    非常感谢您对本网站的关注。Java数据结构之List的使用总结是一个非常重要的主题,这里将为您详细介绍。 1. List是什么 在Java中,List是一种非常实用的数据结构,它代表了一个元素的有序集合,其中的每个元素都可以用一个整数索引来标识。List允许多个元素重复,同时还可以在集合的任意位置插入或者删除元素。 Java中的List主要分为两类:Arra…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之链表(一)

    欢迎阅读本篇文章,本文将为大家详细讲解C语言中数据结构与算法之链表。接下来,将从以下几个方面为大家讲述: 链表的定义 链表的特点 链表的分类 单向链表的实现及应用 双向链表的实现及应用 示例说明 1. 链表的定义 链表是由一系列节点组合而成的数据结构,每个节点都包含了一个数据域和一个指向下一个节点的指针域。其中,链表的头结点为第一个节点,而尾节点为最后一个节…

    数据结构 2023年5月17日
    00
  • 牛客小白月赛71

    A.猫猫与广告 题目: 分析: 只需考虑c * d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a* b的矩阵的长宽一定小于c * d矩阵的长宽。 code: #include <iostream> #include <cmath&…

    算法与数据结构 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部