了解双重链接循环列表

时间:2016-04-26 12:41:49

标签: java list linked-list circular-list

我在CS课程中有一个关于循环双向链表的作业。我们给出了一个Node类来设置链接等。

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

}

我们的任务是实施一些方法。在列表类中,创建了一个名为“base”的节点

public class DList {



private Node base;

public DList() {

}

所有方法都需要某种形式的遍历列表。根据我的理解,设置一个临时节点等于base.getNext()将给我列表的第一个节点并测试temp!= base是否是我的检查,因为基节点服务到达列表的末尾作为其余节点的锚(如果我的理解是正确的)。

然而,当我尝试做一些代码时,例如:

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

我在我说Node temp = base.getNext()的行中得到一个空指针异常;而对于我的生活,我无法理解为什么,因为正如我之前所说,我认为base.getNext()将是我列表中的第一个元素。

visualization of CDLL

1 个答案:

答案 0 :(得分:0)

不需要虚拟基节点。在这种情况下,base最初为null。 在那种情况下:

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