Wie finden Sie die min/max-element der verketteten Liste
Habe ich eine doppelt verkettete Liste in meinem Fall. Und ich will zu finden, die max-und min-element. Also ich möchte das Sammlungen zu finden. Hier ist mein code unten Knoten zuerst:
public class Node<T> {
Node<T> prev;
Node<T> next;
T data;
public Node(T _data)
{
data = _data;
prev = null;
next = null;
}
public Node(T _data, Node<T> _prev, Node<T> _next)
{
data = _data;
prev = _prev;
next = _next;
}
T getData()
{
return data;
}
public void setNext(Node<T> _next)
{
next = _next;
}
public void setPrev(Node<T> _prev)
{
prev = _prev;
}
public Node<T> getNext()
{
return next;
}
public Node<T> getPrev()
{
return prev;
}
}
Und hier ist meiner Doppelt verketteten Liste-Klasse:
public class DoublyLinkedList<T> {
private Node<T> head;
private Node<T> tail;
int listCount = 0;
public void traverseF()
{
Node<T> temp = head;
while(temp != null)
{
System.out.print(temp.getData() + " ");
temp = temp.getNext();
}
}
public void traverseB()
{
Node<T> temp = tail;
while(temp != null)
{
System.out.print(temp.getData() + " ");
temp = temp.getPrev();
}
}
public void insertFirst(T data)
{
Node<T> temp = new Node<T>(data);
if(head == null)
{
head = temp;
tail = temp;
temp.setNext(null);
temp.setPrev(null);
}
else
{
temp.setNext(head);
head.setPrev(temp);
head = temp;
}
}
}
So, mein main-code:
import java.util.Collections;
public class glavna {
public static void main(String[] args) {
DoublyLinkedList<Integer> DLL = new DoublyLinkedList<Integer>();
DLL.insertFirst(32);
DLL.insertFirst(22);
DLL.insertFirst(55);
DLL.insertFirst(10);
DLL.traverseF();
Integer max = Collections.max(DLL);
}
}
Wie genau rufe ich die Sammlungen.max oder Sammlungen.min-Methode? Ist das nicht die Liste nur notwendig, um den max/min-Elemente?
public T getMin()
{
Node<T> temp = head;
T min = head.getData();
while(temp.getNext() != null)
{
if(temp.getData() < min) //error
{
//min = temp.getData();
}
}
}
- Ihre
DoublyLinkedList
umsetzen sollteCollection
- Schnittstelle, d.h.public class DoublyLinkedList implements Collection
. Dann werden Sie in der Lage zu nennenCollections.max(DLL)
- Eine weitere alternative zur Implementierung der Collection-Schnittstelle, ist zu verfolgen, aktuelle min und max in Ihrem
insertFirst()
Methode. Dann erstellen Sie einfach einegetMin()
undgetMax()
Methoden für die Rückgabe der Minimum-und maximum-Werte in O(1). - Was ist die "Collection" - interface? Gibt es irgendein Beispiel, wie kann ich das umsetzen? Danke.
- siehe hier. Sie müssen implementieren iterator() vor allem, der rest könnte stubs. IMHO, dies ist ein overkill für die einfach Suche nach min/max. Warum kann man nicht einfach erstellen, einfach getMin/Max-Verfahren, zum Beispiel basierend auf Jose Rui Santos Vorschlag ?
- Ich glaube, dass es mehr Sinn macht zu implementieren getMin/Max-Methoden in konventionellen O(N) Weg, vorausgesetzt, er eines Tages muss
remove()
Methode für seine Liste - Überprüfen Sie mein main-post, und sehen, ob es möglich soetwas zu machen? Ich habe eine Fehlermeldung, die sagt ich kann nicht mit den < Methode, es ist undefiniert. Wie kann ich weitermachen?
- In diesem Fall, wenn das Element entfernt werden
n
imremove(n)
entspricht der aktuellen min oder max, dann müssen wir nur noch die neue min oder max in O(n). Auf diese Weise können wir noch Getter in constanst Zeit O(1), da Sie in der Regel häufiger aufgerufen. Offensichtlich, dies ist nicht erforderlich, wenn die Liste auch sortiert halten. In diesem Fall min ist die erste elem, max der Letzte. - Naja, in Anbetracht der Sammlungen Methode würde eine Menge Dinge zu implementieren, fügen und lernen, ich werde gehen den einfacheren Weg und stellen Sie eine separate Funktion. Allerdings, da bin ich mit generics, ich kann nicht mit den <. Wie kann ich vergleichen die Elemente mit generischen Daten? Ich verwende nur ganze zahlen in das Programm, aber ich denke, ich muss implementieren Sie die Funktion mit generischen Typ, wenn ich entscheiden, zu verwenden, etwas anderes später.
- Vergleichen Generika, Ihre
T
implementieren mussComparable
- Schnittstelle. Vergleichen Sie dann mit dercompareTo
Methode. - oder Sie können
Comparator
statt. Siehe meine Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
Umzusetzen
getMin
mit Generika, die Sie brauchen werden, um Sie vergleichen zu können. Sie können beispielsweise eine benutzerdefinierte Komparator zur Methode:Dann, indem Sie mit Ihrer Methode für
Integer
:Ein weiterer Ansatz ist, um Ihre Liste nur halten Vergleichbar Elemente :
und dann haben Sie Ihre
getMin()
Methode verwendencompareTo
Methode :Zweite Ansatz ist weniger ausführlich als
Integer
istComparable
(d.h. implementiert, die Vergleichbar für Sie bereits), so brauchen Sie nicht, um jeden anderen code ändern.if (comparator.compareTo(min) < 0)
was genau ist der comparator? Wo ist es definiert?Liste ist keine Auflistung, so kann man nicht mit Sammlungen mit es.
interface Collection{}
und fügen Sieimplements Collection
in der Klasse, oder muss ich Sie deklarieren die Methoden innerhalb der Kollektion auch?Den
Sammlungen.max
Methode erwartet ein argument, das dieCollection
. Der einfachste Weg wäre wahrscheinlich zu erweiternAbstractCollection
und fügen Sie diese Methoden: