Les nœuds peuvent-ils pointer vers eux-mêmes?
Comme d'autres l'ont dit, c'est certainement possible. Mais peut-être que vous vouliez vraiment dire "est-ce valable?". La réponse à cela est que cela dépend du code qui manipule la liste chaînée. Si vous écrivez ce code, alors c'est à vous de décider si c'est valide. Par exemple, vous pouvez décider que lorsqu'un nœud pointe sur lui-même, alors cela indique la fin de la liste chaînée. Alors voici comment vous pouvez coder une fonction qui recherche une liste chaînée entier pour le nombre 3
:
struct ListNode {
int value;
ListNode* next;
};
bool containsThree(ListNode* list) {
for (; list->next != list; list = list->next) {
if (list->value == 3) {
return true;
}
}
// Also check final node
if (list->value == 3) {
return true;
}
return false;
}
vous pourriez décider que next == nullptr
Sinon signifie la fin de la liste. Dans ce cas containsThree
ressemblerait plus à ceci:
bool containsThree(ListNode* list) {
for (ListNode* node = list; node; node = node->next) {
if (node->value == 3) {
return true;
}
}
return false;
}
Avec cette nouvelle fonction, le cas échéant points de nœud à lui-même alors la fonction serait boucle pour toujours. Vous pouvez corriger cela, et même vérifier les grandes boucles dans la liste, comme ceci:
bool containsThree(ListNode* list) {
std::set<ListNode*> seenNodes;
for (ListNode* node = list; node; node = node->next) {
if (seenNodes.count(node)) {
break;
}
seenNodes.insert(node);
if (node->value == 3) {
return true;
}
}
return false;
}
Il y a un problème avec cette dernière fonction: il a une pénalité de performance significative par rapport à la précédente. C'est donc à vous de décider si les boucles de votre liste sont autorisées et si vous acceptez de les vérifier dans vos fonctions, ou si les boucles ne sont pas autorisées. L'un ou l'autre est correct, il suffit de prendre une décision et de s'y tenir.
(Edit: La première fonction d'exemple est un peu en désordre parce que la condition qui se termine la boucle le fait juste avant nous recherchons 3
dans le dernier nœud Il est également impossible de passer dans une liste vide les deux.. les problèmes sont corrigés dans les exemples nullptr
, mais il est en fait possible de les corriger même en utilisant la règle "node == node->next
signifie la fin de la liste" La clé consiste à ajouter un nœud factice à la fin de la liste chaînée Vous n'avez pas besoin de vérifier ce nœud pour trois-ness, et un tel nœud représente une liste vide.)
Sur un PC normal, une variable pointeur est simplement un entier, dont la valeur est une adresse en mémoire. Vous pouvez attribuer cette valeur comme vous le souhaitez, comme n'importe quelle autre variable. Tant que les types de variables sont compatibles bien sûr. –
Oui, je comprends ce qu'est un pointeur. Im essayant de confirmer si ma compréhension de comment naviguer une liste liée est correcte. Comme si ces missions au fond faisaient ce que je pense qu'elles font. – Duxa