Tri à bulles Manuellement une Liste Liée dans Java
C'est ma première question ici.
Je suis en train de trier manuellement une liste chaînée d'entiers en java et je n'arrive pas à comprendre quel est le problème avec mon code. Toutes les suggestions? Je n'ai aucune erreur, mais j'ai toujours ma sortie non ordonnée. J'ai essayé de plusieurs façons, mais rien n'a fonctionné. J'apprécie si quelqu'un peut m'aider avec ça.
public class Node {
int data;
Node nextNode;
public Node(int data) {
this.data = data;
this.nextNode = null;
}
public int getData() {
return this.data;
}
} //Node class
public class DataLinkedList implements DataInterface {
private Node head;
private int size;
public DataLinkedList(){
this.head = null;
this.size = 0;
}
public void add(int data) {
Node node = new Node(data);
if (head == null) {
head = node;
} else {
Node currentNode = head;
while(currentNode.nextNode != null) {
currentNode = currentNode.nextNode;
}
currentNode.nextNode = node;
}
size++;
}
public void sort() {
if (size > 1) {
for (int i = 0; i < size; i++ ) {
Node currentNode = head;
Node next = head.nextNode;
for (int j = 0; j < size - 1; j++) {
if (currentNode.data > next.data) {
Node temp = currentNode;
currentNode = next;
next = temp;
}
currentNode = next;
next = next.nextNode;
}
}
}
}
public int listSize() {
return size;
}
public void printData() {
Node currentNode = head;
while(currentNode != null) {
int data = currentNode.getData();
System.out.println(data);
currentNode = currentNode.nextNode;
}
}
public boolean isEmpty() {
return size == 0;
}
} //DataInterface class
public class DataApp {
public static void main (String[]args) {
DataLinkedList dll = new DataLinkedList();
dll.add(8);
dll.add(7);
dll.add(6);
dll.add(4);
dll.add(3);
dll.add(1);
dll.sort();
dll.printData();
System.out.println(dll.listSize());
}
} //DataApp class
- Vous n'êtes pas en train de changer les liens à l'intérieur des nœuds.
- vous ne Nœud currentNode = tête; à chaque fois. mais vous ne modifiez pas la tête. actuellement vous de comparer le premier élément avec d'autres de la taille de fois
Vous devez vous connecter pour publier un commentaire.
Le problème, comme prévu, vient dans la méthode
sort()
:Un problème mineur est juste de faire toujours exécuter le tri à bulles n*n fois. Il est effectivement mieux de vérifier s'il y a un changement entre toutes les paires dans la liste. Si c'était le cas, il est nécessaire d'exécuter à nouveau tous les cours de la liste; sinon, il n'y en a pas. Pensez à la marginales cas dans lequel une liste de 100 éléments est déjà trié quand
sort()
est appelé. Cela signifie que les noeuds de la liste serait courir plus de 10000 fois, même quand il n'y a effectivement rien à faire!Le principal problème, cependant, est que vous échangez des pointeurs vers les nœuds de votre liste.
Si vous traduire currentNode par
v[i]
et prochaine parv[i - 1]
, comme si vous étiez le tri d'un tableau, cela ne serait. Cependant, vous êtes juste de changer les pointeurs que vous utilisez pour exécuter sur la liste, sans effet dans la liste elle-même. La meilleure solution (enfin, à condition que vous allez utiliser BubbleSort, qui est toujours la pire des solutions) serait d'échanger des données à l'intérieur des nœuds.Toutefois, pour une question de l'illustration du concept, je vais proposer de changer les liens entre les nœuds. Ces pointeurs sont ceux qui, en fait, marque le tri dans la liste. Je parle de la
nextNode
attribut dans la Nœud classe.Assez de chat, elle est ici:
L'explication pour un "double" code de gérer le nœud d'échange, c'est que, depuis que vous avez à changer les liens entre les nœuds, et ce est juste une seule liste liée, alors vous devez garder une trace de la précédente nœud (vous n'avez pas une tête de nœud, soit), dont le premier temps est
head
.Vous pouvez trouver le code dans IdeOne, ici: http://ideone.com/HW5zw7
Espère que cette aide.
Vous devez échanger les données, non seulement les nœuds.
vous pouvez écrire cette methode comme ceci: