PHP реализует связанный список основных структур данных

задняя часть PHP

связанный список

Связный список — это общая базовая структура данных, это линейный список, но он хранит данные не в линейном порядке, а хранит указатель (Pointer) на следующий узел в каждом узле.

Использование структуры связанного списка позволяет преодолеть недостаток, заключающийся в том, что размер данных массива связанного списка должен быть известен заранее Структура связанного списка позволяет полностью использовать пространство памяти компьютера и реализовать гибкое динамическое управление памятью. Однако связанный список теряет преимущество случайного чтения массива, а накладные расходы связанного списка относительно велики из-за увеличения поля указателя узла.

Существует множество различных типов связанных списков: односвязные списки, двусвязные списки и циклические связанные списки.

Односвязный список

Самый простой тип связанного списка — это односвязный список, который содержит два поля: информационное поле и поле указателя. Эта ссылка указывает на следующий узел в списке, а последний узел указывает на нулевое значение.

PHP реализует простой односвязный список

<?php

class Node
{
    private $Data;//节点数据
    private $Next;//存储下个点对象

    public function __construct($data, $next)
    {
        $this->Data = $data;
        $this->Next = $next;
    }

    public function __set($name, $value)
    {
        if (isset($this->$name))
            $this->$name = $value;
    }

    public function __get($name)
    {
        if (isset($this->$name))
            return $this->$name;
        else
            return NULL;
    }
}

class LinkList
{
    private $head;//头节点
    private $len;

    /**
     * 初始化头节点
     */
    public function __construct()
    {
        $this->init();
    }

    public function setHead(Node $val)
    {
        $this->head = $val;
    }

    public function getHead()
    {
        return $this->head;
    }

    public function getLen()
    {
        return $this->len;
    }

    public function init()
    {
        $this->setHead(new Node(NULL, NULL));
        $this->len = 0;
    }

    /**
     * 设置某位置节点的数据
     * @param int $index
     * @param $data
     * @return bool
     */
    public function set(int $index, $data)
    {
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL && $i <= $index) {
            $node = $node->Next;
            $i++;
        }
        $node->Data = $data;
        return TRUE;
    }

    /**
     * 获取某位置节点的数据
     * @param int $index
     * @return mixed
     */
    public function get(int $index)
    {
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL && $i <= $index) {
            $node = $node->Next;
            $i++;
        }
        return $node->Data;
    }

    /**
     * 在某位置处插入节点
     * @param $data
     * @param int $index
     * @return bool
     */
    public function insert($data, int $index = 0)
    {
        if ($index <= 0 || $index > $this->getLen())
            return FALSE;
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL) {
            if ($index === $i) break;
            $node = $node->Next;
            $i++;
        }
        $node->Next = new Node($data, $node->Next);
        $this->len++;
        return TRUE;
    }

    /**
     * 删除某位置的节点
     * @param int $index
     * @return bool
     */
    public function delete(int $index)
    {
        if ($index <= 0 || $index > $this->getLen())
            return FALSE;
        $i = 1;
        $node = $this->getHead();
        while ($node->Next !== NULL) {
            if ($index === $i) break;
            $node = $node->Next;
            $i++;
        }
        $node->Next = $node->Next->Next;
        $this->len--;
        return TRUE;
    }
}

Двусвязный списокБолее сложным типом связанного списка является «двусторонний связанный список» или «двусторонний связанный список». Каждый узел имеет два соединения: одно указывает на предыдущий узел (когда это «соединение» является первым «соединением», оно указывает на нулевое значение или пустой список); а другое указывает на следующий узел (когда это «соединение» — это первое «соединение» — это последнее «соединение», указывающее на нулевое значение или пустой список)

Круговой связанный списокВ круговом связанном списке первый узел и последний узел связаны вместе. Этот метод может быть реализован как в односвязных, так и в двусвязных списках. Чтобы преобразовать круговой связанный список, вы начинаете с любого узла и двигаетесь в любом направлении по списку, пока не вернетесь к начальному узлу. Глядя на другой подход, круговой связанный список можно рассматривать как «безголовый и бесхвостый». Такие списки отлично подходят для сохранения кешей хранилища данных, если у вас есть объект в списке и вы хотите, чтобы все остальные объекты перебирали неспециальную перестановку. Указатель на весь список можно назвать указателем доступа.

Основные идеи почти пора продолжать обновлять