Удаление узла универсального типа с наименьшим значением в двусвязном списке Java - PullRequest
2 голосов
/ 19 марта 2019

Это код, который у меня есть для моего метода getSmallest ():

public T getSmallest() throws EmptyListException
{
    if(isEmpty())
        throw new EmptyListException("List is empty");


    DLNode<T> current = front;
    DLNode<T> minNode = current;
    int minimum = current.getValue();

    while(current.getNext() != null)
    {
        if(minimum > current.getValue())
        {
            minNode = current;
            minimum = current.getValue();
        }

        current = current.getNext();    
    }

    return current.getData();
}

Каждый узел имеет String с именем dataItem и целое число с именем value, связанное с ним. Я хочу увидеть, какой узел имеет наименьшее значение, а затем вернуть dataItem. Проблема в том, что я застрял в цикле while и не знаю почему. Как мне правильно пройти по списку, чтобы я не застрял в цикле while и мог сравнить минимальные значения?

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Вопрос в том, почему условие завершения цикла никогда не достигается?

Является ли ваш список двусвязным списком, последний элемент соединяется с первым элементом?Будет ли getNext() когда-либо отвечать null?

Кроме того, в цикле, как написано, есть проблемы.Смотрите исправленный код ниже.Проблема завершения цикла, вероятно, не устранена этим обновлением.

public T getSmallest() throws EmptyListException {
    if ( isEmpty() ) {
        throw new EmptyListException("List is empty");
    }

    DLNode<T> currentNode = front;

    int minValue = currentNode.getValue();
    DLNode<T> minNode = currentNode;

    while ( (currentNode = currentNode.getNext()) != null ) {
        int nextValue = currentNode.getValue();
        if ( nextValue < minValue ) {
            minNode = currentNode;
            minValue = nextValue;
        }
    }

    return minNode.getData();
}
0 голосов
/ 19 марта 2019

Как вы видели, вы не можете перегружать операторы в Java, и > будет применяться только к числовым типам данных.

Общее решение для этого - иметь T extends Comparable<T> и использовать его compareTo метод:

DLNode<T> current = front;
DLNode<T> minNode = current;
T minimum = current.getValue();

while (current.getNext() != null) {
    if (minimum.compareTo(current.getValue()) > 0) {
        minNode = current;
        minimum = current.getValue();
    }

    current = current.getNext();    
}

return current.getData();

(в качестве альтернативы, если T не является Comparable, вы можете указать пользовательский Comparator и использовать его аналогичным образом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...