2014-11-08 102 views
0

我在我的情況下有一個雙向鏈表。我想找到最大和最小元素。所以我想用集合來找到它。這裏是我下面的代碼節點首先:如何找到鏈接列表的最大/最小元素

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

,這裏是我的雙向鏈表類:

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(); 
     } 
    } 
} 
+2

您的'DoublyLinkedList'應該實現'Collection'接口,即''public class DoublyLinkedList implements Collection''。然後你可以調用'Collections.max(DLL)' – kiruwka 2014-11-08 21:05:17

+0

實現Collection接口的另一種方法是在'insertFirst()'方法中跟蹤當前的最小值和最大值。然後,創建一個'getMin()'和'getMax()'方法來返回O(1)中的最小值和最大值。 – 2014-11-08 21:10:27

+0

@kiruwka'收藏'界面究竟是什麼?有什麼例子可以實現嗎?謝謝。 – user12831231 2014-11-08 21:10:46

回答

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(即,已經爲你實現了Comparable),所以你不需要改變任何其他代碼。

+0

在這一行中:'if(comparator.compareTo(min)<0)'比較器究竟是什麼?它在哪裏定義? – user12831231 2014-11-08 22:00:18

+0

這是一個錯字,抱歉,我編輯它。這是候選人的價值比較分鐘 – kiruwka 2014-11-08 22:01:18

+0

謝謝。這看起來很不錯! – user12831231 2014-11-08 22:08:04

1

你的列表不是Collection,所以你不能使用Collections。

+0

有沒有什麼簡單的例子,我怎樣才能讓我的清單成爲一個集合? – user12831231 2014-11-08 21:10:10

+0

@ user12831231它必須將Collection接口實現爲Collection。 – kraskevich 2014-11-08 21:12:20

+0

所以,我必須做'interface Collection {}'然後在類中添加'implements Collection',或者我還必須在集合中聲明方法嗎? – user12831231 2014-11-08 21:15:32

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

這是一個很好的解決方案,非常感謝。儘管如此,我認爲這已經超出了我的理解水平。我會盡我所能研究它。 – user12831231 2014-11-08 21:28:56

相關問題