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 sollte Collection - Schnittstelle, d.h. public class DoublyLinkedList implements Collection. Dann werden Sie in der Lage zu nennen Collections.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 eine getMin() und getMax() 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 im remove(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 muss Comparable - Schnittstelle. Vergleichen Sie dann mit der compareTo Methode.
  • oder Sie können Comparator statt. Siehe meine Antwort

InformationsquelleAutor user12831231 | 2014-11-08
Schreibe einen Kommentar