Maison > développement back-end > tutoriel php > Explication détaillée de l'inversion d'une chaîne unique utilisant la récursion et la non-récursion

Explication détaillée de l'inversion d'une chaîne unique utilisant la récursion et la non-récursion

韦小宝
Libérer: 2023-03-21 11:44:02
original
1556 Les gens l'ont consulté

Cet article décrit comment réaliser une inversion à chaîne unique en utilisant la récursion et la non-récursion. Il se peut que de nombreux étudiants ne sachent pas grand-chose sur ce qu'est l'inversion à chaîne unique, alors mettons fin aux bêtises. et allez droit au but. Lisez cet article !
La question donne des indications sur le fait que des algorithmes récursifs et itératifs peuvent être utilisés.
Parce que je n'ai pas une compréhension approfondie de la récursivité, j'ai d'abord utilisé l'itération pour écrire l'algorithme. Le nœud principal de la question est considéré comme le premier nœud contenant des données
L'idée de la question : partir du nœud principal, traverser en arrière et suivre l'ordre. L'inversion des chaînes entre les nœuds se réalise progressivement une par une.
Essayez d'abord d'utiliser 2 pointeurs pour terminer l'opération, mais cela échoue

class Solution {
public:       
ListNode* reverseList(ListNode* head) { 
ListNode* pre = NULL;
  while(head -> next)
  {
 pre = head;
 head = head -> next;
 head -> next = pre; 
  }
  return head;
};
Copier après la connexion

La raison est la suivante : pendant le processus d'inversion, dirigez -> next a été inversé et ne peut pas continuer à reculer, alors ajoutez un pointeur et utilisez 3 pointeurs pour terminer l'opération

class Solution {
public:       
ListNode* reverseList(ListNode* head) { 
ListNode* pre = NULL;
  while(head)
  {
 ListNode* next = head -> next;
 head -> next = pre;//head是尾结点,指针置空
 head = next;
 pre = head; 
  }
  return pre;           //head = NULL
};
Copier après la connexion

La récursion ne sera pas travail. Après avoir fait référence à Discuter, vous comprendrez.
L'idée est la suivante : par récursivité, le nœud de tête est continuellement parcouru vers l'arrière jusqu'à ce que la condition de terminaison : s'arrête après avoir atteint le nœud de queue.
Le code est le suivant :

class Solution {
public:       
ListNode* reverseList(ListNode* head) { 
//终止条件,达到尾结点停止
if(head == NULL || head ==NULL)
return head;
else
{
//头结点向后移动
ListNode* temp = reverList(head->next);
head->next->next = head;   //1
head->next = NULL;         //2
}
return temp;
};
Copier après la connexion

Le statut présenté lorsque la condition de terminaison récursive est atteinte est comme suit :




Le statut après retour au niveau de récursivité précédent est le suivant :


Après avoir commenté 1 et 2, les deux lignes de code sont les suivantes :


On peut voir que la position du nœud principal est liée au nombre de niveaux de récursion, et en tant que nœud principal après l'inversion, la position de temp reste toujours inchangée, obtenant ainsi l'effet d'inversion.
Bien que je puisse comprendre le code récursif, je ne sais pas encore comment le concevoir et je suis encore novice.

Articles connexes :

Implémentation PHP Chaîne uniqueExemple d'opération de retournement de table



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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal