查找双向链表的长度

时间:2016-04-24 21:43:32

标签: java list doubly-linked-list

我在计算双重链表的元素时遇到了一些麻烦

这是节点类:

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,但我的功能不计算任何东西。谢谢您的帮助!

3 个答案:

答案 0 :(得分:0)

在基数是唯一的元素的情况下,另一个答案不会起作用。它应该是一段时间,如:

var ref = new Firebase("myapp.firebaseio.com");
var val = [1, 2, 3][-1];
ref.safeSet(val);

您的代码假设您使用的是循环双向链表,并且这假设是以空终止的列表。你想去哪儿?

答案 1 :(得分:0)

我认为您之前的代码假设您使用的是循环双向链接列表,而alpert的答案为非循环链接列表提供了计数

如果要创建循环双向链表,请尝试以下操作: 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; } 您应该设置setNext(Node node)

node.previous = this;您应该设置setPrevious(Node node)

答案 2 :(得分:0)

您应该检查temp != null,但实际上您的代码应该更加简单。

这样做:

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

更少的代码意味着更少的错误,并且更容易阅读和理解。