我在计算双重链表的元素时遇到了一些麻烦
这是节点类:
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,但我的功能不计算任何东西。谢谢您的帮助!
答案 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;
}
更少的代码意味着更少的错误,并且更容易阅读和理解。