如何查找链表的最大/最小元素

时间:2014-11-08 20:59:35

标签: java collections linked-list max min

在我的案例中,我有一个双重链表。我想找到max和min元素。所以我想使用Collections来找到它。以下是我的第一个节点代码:

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;
    }
}

这是我的Doubly Linked List类:

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;
        }
    }

}

所以,我的主要代码是:

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);

    }
}

我究竟如何调用Collections.max或Collections.min方法?仅仅是找到最大/最小元素所必需的列表吗?

public T getMin()
{
    Node<T> temp = head;
    T min = head.getData();
    while(temp.getNext() != null)
    {
        if(temp.getData() < min) // error
        {
            //min = temp.getData();
        }
    }
}

3 个答案:

答案 0 :(得分:2)

要使用泛型实现getMin,您需要能够比较它们。例如,您可以为您的方法提供自定义Comparator

public T getMin(Comparator<? super T> comparator) {
    Node<T> temp = head.getNext();
    T min = head.getData();
    while(temp != null) {
        T candidateValue = temp.getData();
        if (comparator.compare(candidateValue, min) < 0) { // equivalent to candidate < min
            min = candidateValue;
        }
        temp = temp.getNext();
    }
    return min;
}

然后,调用Integer的方法:

getMin(new Comparator<Integer>() {
    @Override
    public int compare(Integer arg0, Integer arg1) {
        return arg0.compareTo(arg1);
    }
 });

另一种方法是让您的列表仅保留Comparable个项目:

public class DoublyLinkedList<T extends Comparable<? super T>> {

然后让您的getMin()方法使用compareTo方法:

public T getMin() {
    Node<T> temp = head.getNext();
    T min = head.getData();
    while(temp != null) {
        T candidateValue = temp.getData();
        if (candidateValue.compareTo(min) < 0) { // equivalent to candidate < min
            min = candidateValue;
        }
        temp = temp.getNext();
    }
    return min;
}

第二种方法不那么冗长,因为IntegerComparable(即已经为您实现了可比性),因此您不需要更改任何其他代码。

答案 1 :(得分:1)

您的列表不是集合,因此您无法使用集合。

答案 2 :(得分:0)

Collections.max方法需要一个实现Collection的参数。最简单的方法可能是扩展AbstractCollection并添加这些方法:

@Override
public Iterator<T> iterator() {
    return new Iterator<T>() {
        private Node<T> node = head;
        @Override
        public boolean hasNext() {
            return node != null;
        }

        @Override
        public T next() {
            T next = node.data;
            node = node.getNext();
            return next;
        }
    };
}

@Override
public int size() {
    int size = 0;
    Node<T> node = head;
    while (node != null) {
        size++;
        node = node.getNext();
    }
    return size;
}