2017-11-12 10 views
1

이 코드를 작성하여 링크 된 목록에서 최소 일련의 번호를 찾습니다.이중 링크 목록에서 작동하지 않는 최소 요소 찾기

public DLNode<T> getMinimum() { 
    if (isEmpty()) { 
     return null; 
    } 
    DLNode<T> curr = head; 
    DLNode<T> min = curr; 
    T temporaryMinimum = head.getElement(); 
    while (curr.getElement() != null) { 
     if ((Integer) temporaryMinimum < (Integer) curr.getElement()) { 
      min = curr; 
     } 
     curr = curr.getNext(); 
    } 
    return min; 
} 

그래서 같은 주 내에서 호출이 코드 블록

public static void getMinElement(){ 
    int[] data = {2, 3, 5, 1, 6}; 
    //Add elements to the list from array data 
    DoublyLinkedList<Integer> ll = new DoublyLinkedList<>(); 

    for (int i = 0; i < data.length; i++) { 
     ll.AddLast(data[i]); 
    } 

    System.out.println("Size: " + ll.size); 

    System.out.println("Minimum Element is: " + ll.getMinimum()); 

} 

사용하여 테스트입니다 : 그것은 오류를 던져하지 않습니다

getMinElement(); 

을하지만,에 들어갈 것으로 보인다 무한 루프 또는 무언가 (내가 시작할 때마다 얼마나 많은 CPU가 내 컴퓨터에서 사용되는지 판단하여).

내 IDE (IntelliJ IDEA)가 제어되지 않는 루프 또는 이와 유사한 오류 또는 경고를 표시하지 않는다는 점을 지적하고 싶습니다. 나는 지난 몇 일 동안 행운이없이 그것을 추론 해왔다. 이제 나는 아이디어가 없다.

도움을 주시면 감사하겠습니다.

편집 : 내 DLNode 클래스는 다음과 같습니다

class DLNode<T> { 
    DLNode<T> Element; 
    T data; 
    DLNode<T> next; 
    DLNode<T> prev; 

    DLNode(T data, DLNode<T> next, DLNode<T> prev) { 
     this.data = data; 
     this.next = next; 
     this.prev = prev; 
    } 

    T getElement() { 
     return data; 
    } 
    public DLNode<T> getPrev() { 
     return prev; 
    } 
    public void setPrev(DLNode<T> prev) { 
     this.prev = prev; 
    } 
    public DLNode<T> getNext() { 
     return next; 
    } 
    public void setNext(DLNode<T> next) { 
     this.next = next; 
    } 
} 
+2

측면 점하십시오'Integer'에 제네릭 형식'T'를 캐스팅하는 것은 나에게 매우 잘못된 것 같습니다. – Dabiuteef

+0

[LinkedList ] (https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html)은 이중 연결 목록 구현입니다. 따라서 curr.getNext();를 실행하는 것보다 [listiterator]를 얻을 수없는 이유는 무엇입니까 (https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html#listIterator int)) 반복하고 반복합니다. 'curr.getNext()'가 올바르지 않은 것 같습니다. –

답변

1
  1. 루프는 curr != null 경우 확인해야합니다. 그렇지 않으면 결국 NullPointerException이됩니다.

  2. 비교를 수행해야합니다 (교체하려면 curr.getElement()temporaryMinimum보다 작아야합니다).

  3. 새로운 최소값을 찾으면 temporaryMinimum을 수정해야합니다.

  4. DLNode 클래스가 일반 클래스라고 가정하면 TInteger 번으로 전송할 수 없습니다. T extends Comparable<T>이 필요하므로 > 또는 < 대신 compareTo을 사용할 수 있습니다.

  5. 아, 그리고 여전히 무한 루프가 발생하는 경우 링크 된 목록이 원형입니다 (즉, 마지막 노드의 getNext()가 첫 번째 노드를 반환합니다). 나는 DoublyLinkedList 클래스를 보지 않고서는 확신 할 수 없습니다.

    while (curr != null) { 
        if (curr.getElement() != null) { 
         if (temporaryMinimum.compareTo(curr.getElement()) > 0) { 
          min = curr; 
          temporaryMinimum = curr.getElement(); 
         } 
        } 
        curr = curr.getNext(); 
    }