2017-09-07 7 views
0

J'écris une liste chaînée (n'utilisant pas Java) et essaye de créer une méthode get pour renvoyer un élément de la liste par son numéro d'index. A l'origine, j'ai écrit ceci en utilisant une boucle for. Mon code échoue à plusieurs reprises un test dans lequel il récupère l'élément à l'index 0 (il semble que je puisse récupérer des éléments sur d'autres indices). Curr est juste pour moi de garder une trace du nœud actuel. Je pensais que la boucle for pourrait être ce qui me causait des problèmes, donc je l'ai écrit comme une boucle while.Récupération d'un élément par index dans une liste chaînée Java

while (curr != null) { 
    if (i == index) { 
    i++; 
    return curr.data; 
} 
curr = curr.next; 
} 

Cependant, je n'arrive toujours pas à récupérer l'élément à l'index 0. J'apprécie toute contribution sur la façon dont ces méthodes de parcours pourraient être problématiques. Je suis un peu perdu. Aussi mes excuses si ma mise en forme est désactivée, je m'habitue toujours au formatage sur ce site.

+0

Notez que vos Bounds contrôles (par exemple 'si (index> numElts) {') devrait être avant la boucle, car ils ne changent pas de valeur dans le corps de la boucle. –

+0

@AndyTurner La vérification des limites internes ne devrait même pas être nécessaire car elles ne font que itéter de '' this.size() '. – billie

+0

@billie true, mais pourquoi déranger iterating toute la liste si vous savez qu'il est hors limites pour commencer? –

Répondre

0

Vous initialisez curr en tant que sentinal.next, cela ne vous ferait-il pas manquer le premier élément? Vous devriez également avoir une erreur «off-by-one» pour chaque élément, comme si votre liste était indexée de 1 au lieu de 0 indexée.

Dans la boucle while, vous n'êtes pas itérer i à moins qu'il soit égal à l'indice, de sorte que vous ne trouverez jamais le cas qui i == index à moins index est 0.

+0

Les sentinelles sont normalement utilisées comme des éléments qui se trouvent avant et après les premier et dernier éléments d'une structure de données, afin de simplifier la logique sans avoir à utiliser autant de vérifications nuls. En supposant qu'une partie de celle-ci est correctement configurée, sentinel.next de départ devrait être l'élément d'index 0. – billie

+0

Je pense que c'est le seul endroit où l'erreur pourrait être, car la boucle for casserait et retournerait sur la ligne 7 si 'index' est 0. A moins que je ne manque quelque chose. – Bricky

+0

Je pense que vous avez raison, ce qui me fait penser que c'est une erreur dans la configuration ou l'interprétation des données. – billie