Explication détaillée de la liste chaînée en php
Le fonctionnement de la liste chaînée est bien plus compliqué que celui de la liste séquentielle. Parce que PHP a en effet résolu de nombreux problèmes de fonctionnement des tableaux pour nous, nous pouvons utiliser les tableaux très facilement et nous n'avons pas besoin de définir de nombreuses opérations logiques pour les tableaux. Par exemple, en C, les tableaux ont une limite de longueur, mais en PHP nous ne considérerons pas ce problème.
La définition de la structure chaînée
Tout d'abord, dans le premier article précédent sur les listes linéaires, nous avons parlé de la définition des listes chaînées. Ici, nous allons revoir le diagramme précédent sur les listes chaînées pour obtenir plus de détails. Comprendre clairement le concept de listes chaînées.
Nous représentons le nœud Node dans l'image comme une classe :
/** * 链表结构 */ class LinkedList { public $data; public $next; }
Une classe de liste chaînée peut être considérée comme un nœud dans la liste chaînée. Elle contient deux contenus, data représente les données et next représente le nœud suivant. .pointeur. Tout comme une chaîne, un maillon dans un autre, c'est la légendaire structure de liste chaînée.
Génération d'une liste chaînée et opérations d'initialisation
/** * 生成链表 */ function createLinkedList() { $list = new LinkedList(); $list->data = null; $list->next = null; return $list; } /** * 初始化链表 * @param array $data 链表中要保存的数据,这里以数组为参考 * @return LinkedList 链表数据 */ function Init(array $data) { // 初始化 $list = createLinkedList(); $r = $list; foreach ($data as $key => $value) { $link = new LinkedList(); $link->data = $value; $link->next = null; $r->next = $link; $r = $link; } return $list; } $link = Init(range(1, 10)); print_r($link); // LinkedList Object // ( // [data] => // [next] => LinkedList Object // ( // [data] => 1 // [next] => LinkedList Object // ( // [data] => 2 // [next] => LinkedList Object // ( // [data] => 3 // [next] => LinkedList Object // ( // [data] => 4 // [next] => LinkedList Object // ( // [data] => 5 // [next] => LinkedList Object // ( // [data] => 6 // [next] => LinkedList Object // ( // [data] => 7 // [next] => LinkedList Object // ( // [data] => 8 // [next] => LinkedList Object // ( // [data] => 9 // [next] => LinkedList Object // ( // [data] => 10 // [next] => // ) // ) // ) // ) // ) // ) // ) // ) // ) // ) // )
Lors de l'utilisation d'une liste chaînée, nous faisons généralement en sorte que le premier nœud ne contienne aucune donnée, mais sert simplement de nœud vide pour pointer vers le premier nœud contenant des données. Nous pouvons appeler ce type de nœud le nœud principal. Si vous devez déterminer si la liste chaînée est vide, il vous suffit de déterminer si le prochain du premier nœud est vide. Dans le code ci-dessus, la fonction createLinkedList() génère en fait un tel nœud principal.
Ensuite, nous construisons cette liste chaînée via la fonction d'initialisation Init(). Le processus de construction est relativement simple. Ici, nous passons un tableau et construisons la liste chaînée en fonction de la structure du tableau. Bien sûr, dans les applications pratiques, nous pouvons utiliser n'importe quelle donnée pour construire la liste chaînée. Le processus de construction n'est pas compliqué. Il suffit d'attribuer le nœud actuel à la variable r, puis de créer un nouveau nœud et de rendre r->next égal au nœud nouvellement créé. La structure imprimée directement à partir de la liste chaînée construite est la forme dans le commentaire.
Parcours d'une liste chaînée
function IteratorLinkedList(LinkedList $link) { while (($link = $link->next) != null) { echo $link->data, ','; } echo PHP_EOL; }
Le parcours d'une liste chaînée est-il très similaire au fonctionnement du curseur de certaines bases de données, ou au fonctionnement du mode itérateur ? C'est vrai, en fait, la structure des curseurs et des itérateurs est une forme de liste chaînée. Nous continuons à chercher $next jusqu'à ce qu'il n'y ait plus de nœud suivant, complétant ainsi un parcours de liste chaînée. On peut voir que la complexité temporelle de ce processus est O(n).
Insertion et suppression
/** * 链表指定位置插入元素 * @param LinkedList $list 链表数据 * @param int $i 位置 * @param mixed $data 数据 */ function Insert(LinkedList &$list, int $i, $data) { $j = 0; $item = $list; // 遍历链表,找指定位置的前一个位置 while ($j < $i - 1) { $item = $item->next; $j++; } // 如果 item 不存在或者 $i > n+1 或者 $i < 0 if ($item == null || $j > $i - 1) { return false; } // 创建一个新节点 $s = new LinkedList(); $s->data = $data; // 新创建节点的下一个节点指向原 i-1 节点的下一跳节点,也就是当前的 i 节点 $s->next = $item->next; // 将 i-1 节点的下一跳节点指向 s ,完成将 s 插入指定的 i 位置,并让原来的 i 位置元素变成 i+1 位置 $item->next = $s; return true; } /** * 删除链表指定位置元素 * @param LinkedList $list 链表数据 * @param int $i 位置 */ function Delete(LinkedList &$list, int $i) { $j = 0; $item = $list; // 遍历链表,找指定位置的前一个位置 while ($j < $i - 1) { $item = $item->next; $j++; } // 如果 item 不存在或者 $i > n+1 或者 $i < 0 if ($item == null || $j > $i - 1) { return false; } // 使用一个临时节点保存当前节点信息,$item 是第 i-1 个节点,所以 $item->next 就是我们要找到的当前这个 i 节点 $temp = $item->next; // 让当前节点,也就是目标节点的上一个节点, i-1 的这个节点的下一跳(原来的 i 位置的节点)变成原来 i 位置节点的下一跳 next 节点,让i位置的节点脱离链条 $item->next = $temp->next; return true; } // 插入 Insert($link, 5, 55); // 遍历链表 IteratorLinkedList($link); // 1,2,3,4,55,5,6,7,8,9,10, // 删除 Delete($link, 7); // 遍历链表 IteratorLinkedList($link); // 1,2,3,4,55,5,7,8,9,10,
L'insertion et la suppression de listes chaînées sont en fait très similaires. Elles doivent toutes deux trouver l'élément précédent à la position d'insertion ou de suppression, qui est l'élément à la i-1ème position. Ensuite, l'insertion et la suppression des éléments de la liste chaînée sont implémentées en actionnant le pointeur suivant de cet élément.
Les codes dans les deux fonctions de parcours et de jugement de position sont en fait les mêmes. La différence est que lors de la création, vous devez créer un nouveau nœud, puis laisser le suivant de ce nœud pointer vers le suivant du i- précédent. 1 élément de position. Pointez ensuite le prochain élément à la position i-1 vers le nœud nouvellement créé. L'opération de suppression consiste à enregistrer le nœud à la position i à supprimer dans une variable temporaire, puis à faire pointer le prochain élément à la position i-1 vers le suivant à la position supprimée i.
L'explication ci-dessus doit être consultée étape par étape en conjonction avec le code. Bien sûr, nous pouvons également l'apprendre en conjonction avec l'image ci-dessous. Les opérations d'insertion et de suppression sont au cœur des opérations de liste chaînée et la partie la plus complexe, qui nécessite beaucoup de compréhension et de maîtrise.
Recherche basée sur la position, recherche basée sur les données
/** * 根据位置查找元素位置 * @param LinkedList $list 链表数据 * @param int $i 位置 */ function GetElem(LinkedList &$list, int $i) { $item = $list; $j = 1; // 从第一个开始查找,0是头结点 while ($item && $j <= $i) { $item = $item->next; $j++; } if (!$item || $j > $i + 1) { return false; } return $item->data; } /** * 根据数据查找数据元素所在位置 * @param LinkedList $list 链表数据 * @param mixed $data 数据 */ function LocateElem(LinkedList &$list, $data) { $item = $list; $j = 1; // 从第一个开始查找,0是头结点 while (($item = $item->next)!=null) { if($item->data == $data){ return $j; } $j++; } return false; } // 获取指定位置的元素内容 var_dump(GetElem($link, 5)); // int(55) // 获取指定元素所在的位置 var_dump(LocateElem($link, 55)); // int(5)
Il existe deux formes de recherche dans les listes chaînées. La première consiste à donner une position. Par exemple, si je veux que le contenu de l'élément soit en cinquième position. L'élément est recherché en fonction de la valeur de position spécifiée, tout comme un index de tableau. Cependant, il convient de noter que l'index de la liste chaînée commence à 1, car la position 0 est notre nœud principal. Bien sûr, on peut aussi changer le code pour ignorer le nœud demi-tour et le rendre cohérent avec le tableau, mais dans ce cas, les caractéristiques de la liste chaînée ne seront pas évidentes, on commence donc toujours par 1 dans le code de test ici.
Un autre type de recherche consiste à donner le contenu d'une donnée et à trouver sa position dans la liste chaînée. En fait, les deux algorithmes parcourent l’intégralité de la liste chaînée et il n’y a pratiquement aucune différence. Puisqu'une liste chaînée n'a pas la capacité d'indicer comme un tableau, la complexité temporelle de ses opérations de recherche est O(n).
Résumé
Que diriez-vous, la difficulté augmente. Le fonctionnement de la liste chaînée sera beaucoup plus compliqué. Ne vous inquiétez pas, ce n'est qu'un apéritif. Le contenu que vous apprendrez plus tard tournera essentiellement autour des deux formes de listes séquentielles (tableaux) et de listes chaînées. Et notre étude des listes chaînées n'est pas encore terminée. Dans le prochain article, nous examinerons plus en détail d'autres formes de listes chaînées : les listes chaînées doublement, les listes chaînées circulaires et les listes chaînées doublement circulaires.
Code de test :
https://github.com/zhangyue0503/Data-structure-and-algorithm/blob/master/2.线性表/source/2.3%20链表的相关逻辑操作.php
Apprentissage recommandé : Tutoriel vidéo php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Liaison statique (statique: :) implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.
