2016-04-24 2 views
2

У меня возникли некоторые проблемы с подсчетом элементов моего двусвязного спискаПоиска Длина двусвязного Списка

здесь класс узла:

public class Node { 
    private Node previous, next; 
    private Object data; 

    public Node(Object data) { 
    this.data = data; 
    } 

    public Node() { 

    } 

    public Node(Object data, Node previous, Node next) { 
    this.previous = previous; 
    this.next = next; 
    this.data = data; 
    } 

    public Node getPrevious() { 
    return previous; 
    } 

    public void setPrevious(Node previous) { 
    this.previous = previous; 
    } 

    public Node getNext() { 
    return next; 
    } 

    public void setNext(Node next) { 
    this.next = next; 
    } 

    public Object getData() { 
    return data; 
    } 

    public void setData(Object data) { 
    this.data = data; 
    } 

}

и вот где я мои методы для моего дважды связанного списка

public class DList { 

    private Node base; 

    public DList() { 

    } 

    /** 
    * Return the number of elements in the list. 
    */ 
    public int size() { 
    int count = 0; 
    if (base == null) 
     return count; 
    else { 
     Node temp = base; 
     do { 
      temp = temp.getNext(); 
      count++; 
     } while (temp != base); 
    } 
    return count; 
    } 
} 

при тестировании результат должен 5, но моя функция ничего не считает. Спасибо за помощь!

+1

Если у вас нет кругового списка, ваше условие цикла неверно. Вероятно, это должно быть 'while (temp! = Null)' – nem035

+0

Извините, что забыл упомянуть, это круговой список. Мой плохой :( –

ответ

0

Другой ответ не будет работать, в случае, когда базой является единственный элемент. Это должно быть в то время, как:

public int size() { 
    int count = 0; 
    if (base.getNext() == base) 
     return count; 
    else { 
     Node temp = base.getNext(); 
     while (temp != base) { 
      temp = temp.getNext(); 
      count++; 
     } 
    } 
    return count; 
} 

Ваш код был в предположении, что вы использовали круговое дважды связанный список, и это предполагает завершающим нулем список. На что вы шли?

+0

Извините, я забыл упомянуть, что это круговой список –

+0

Получил его! – rosstex

+0

Спасибо за помощь! Я получаю исключение из null-указателя, и я не уверен, почему. –

0

Я думаю, что ваш предыдущий код был в предположение, что вы использовали круговой дважды связанный список, и ответ Алперт обеспечивает подсчет для не-циркулярно связанного списка

Если вы хотите создать круговой дважды связанный список попробовать следующее: setNext(Node node) вы должны установить node.previous = this;

setPrevious(Node node) вы должны установить node.next = this;

0

вы должны проверять на temp != null, но на самом деле ваш код должен быть намного проще.

Просто сделай это:

public int size() { 
    int count = 0; 
    for (Node node = base; node != null; node = node.getNext()) 
     count++; 
    return count; 
} 

Меньше кода означает меньше ошибок, и это легче читать и понимать.

Смежные вопросы