J'étudie pour un examen, et ceci est un problème d'un ancien test:
Nous avons une liste lié individuellement avec une tête de liste avec la déclaration suivante: p>
list.addLast(x);
9 Réponses :
boucle au dernier élément de la liste liée qui présente le prochain pointeur à NULL, puis modifiez le pointer suivant pour pointer sur un nouveau nœud qui possède les données = objet et le pointer suivant = null p>
Vous souhaitez naviguer dans la liste liée entière à l'aide d'une boucle et vérifiez la valeur "Suivant" pour chaque nœud. Le dernier nœud sera celui dont la prochaine valeur est null. Faites simplement une nouvelle valeur de ce nœud un nouveau nœud que vous créez avec les données d'entrée.
node temp = first; // starts with the first node. while (temp.next != null) { temp = temp.next; } temp.next = new Node(header, x);
La partie la plus importante est le cas de base, où est d'abord nul. Devrait être traité de manière appropriée (c'est-à-dire que ne jette pas une nullpointerexception)
Voici un indice, vous avez un graphique de nœuds dans la liste liée et vous gardez toujours une référence à la tête qui est le premier nœud de la liste LinkedList.
Next pointe sur le nœud suivant de la liste Linked Linked Linked LinkedList. Lorsque vous êtes ensuite NULL, vous êtes à la fin de la liste. P>
class Node { Object data; Node next; Node(Object d,Node n) { data = d ; next = n ; } public static Node addLast(Node header, Object x) { // save the reference to the header so we can return it. Node ret = header; // check base case, header is null. if (header == null) { return new Node(x, null); } // loop until we find the end of the list while ((header.next != null)) { header = header.next; } // set the new node to the Object x, next will be null. header.next = new Node(x, null); return ret; } }
Oui, il y a toujours un moyen de boucler de manière récursive. Utilisez l'en-tête == NULL comme le cas de base (où vous vous arrêterez) et appelez Addlast avec Header.Next.
Donc, je ferais que la déclaration II ne vienne que de retourner; Et le dernier header.Next être header.next = addlast (en-tête, null)?
En quelque sorte, vous devez transmettre x via la boucle récursive: addlast (en-tête, x), puis si l'en-tête == NULL, créez le nouveau nœud, ajoutez-y et renvoyez le nouveau nœud. Si non dans le cas de base, vous devez renvoyer le résultat de Addlast
Votre code est exécuté dans O (n) heure, mais cette opération devrait être O (1). Si vous gardez une trace du nœud queue, vous n'avez pas besoin de boucler chaque élément de la liste. Tout ce que vous faites est de mettre à jour la queue pour pointer vers le nouveau nœud.
@Tomdane L'instruction Problème indique que nous devons prendre comme entrée le nœud de tête tout en ajoutant à la fin de la liste.
Voici une solution partielle à votre classe de liste liée, j'ai laissé le reste de la mise en œuvre à vous et a également laissé la bonne suggestion d'ajouter un nœud queue dans le cadre de la liste liée à vous.
Le fichier de nœud: p> et voici un fichier de liste liée: p>
Les programmes ci-dessus peuvent vous donner NullPointerException. C'est un moyen plus facile d'ajouter un élément à la fin de la liste liée.
public class LinkedList { Node head; public static class Node{ int data; Node next; Node(int item){ data = item; next = null; } } public static void main(String args[]){ LinkedList ll = new LinkedList(); ll.head = new Node(1); Node second = new Node(2); Node third = new Node(3); Node fourth = new Node(4); ll.head.next = second; second.next = third; third.next = fourth; fourth.next = null; ll.printList(); System.out.println("Add element 100 to the last"); ll.addLast(100); ll.printList(); } public void printList(){ Node t = head; while(n != null){ System.out.println(t.data); t = t.next; } } public void addLast(int item){ Node new_item = new Node(item); if(head == null){ head = new_item; return; } new_item.next = null; Node last = head; Node temp = null; while(last != null){ if(last != null) temp = last; last = last.next; } temp.next = new_item; return; } }
L'addlast () nécessite une certaine optimisation car la boucle tandis que la boucle d'addlast () a o (n) complexité. Vous trouverez ci-dessous ma mise en œuvre de LinkedList. Exécutez le code avec ll.addlastx (i) une fois et exécutez-le avec ll.adddlast (i) à nouveau, vous pouvez voir que leur est beaucoup de différence dans le temps de traitement de AddLastex () avec AddLast ().
nœud.java p> linkedlist.java p>
Si vous gardez une trace du nœud queue, vous n'avez pas besoin de boucler à chaque élément de la liste.
Il suffit de mettre à jour la queue pour pointer vers le nouveau nœud: P>
AddValueToListEnd(value) { var node = new Node(value); if(!this.head) { this.head = node; this.tail = node; } else { this.tail.next = node; //point old tail to new node } this.tail = node; //now set the new node as the new tail }
Bravo pour O (1)
Utile lorsque vous avez besoin d'ajouter plusieurs éléments à la fin, n'avez pas besoin de faire défiler la liste complète à chaque fois.
public static Node insertNodeAtTail(Node head,Object data) { Node node = new Node(data); node.next = null; if (head == null){ return node; } else{ Node temp = head; while(temp.next != null){ temp = temp.next; } temp.next = node; return head; } }
Pourquoi avez-vous besoin de passer dans l'en-tête de nœud pour annoncer quelque chose à la fin de la liste?
Écrivez votre propre implémentation pour
addlast (noeud en-tête, objet x) qui ajoute x à la fin de la liste code> Google pour l'ajout d'élément à la fin de la Linked LinkedList en Java
@Therin - Demandez probablement à son professeur que.
@Therin, c'est la question exacte, idk.
Essayez d'ajouter la méthode à la classe de nœud en tant que méthode statique et en boucle à la fin de l'en-tête de nœud, puis ajoutez un nouveau nœud à la fin de cette liste.