3 回答
TA贡献1790条经验 获得超9个赞
不清楚你在代码中做了什么,所以我对其进行了一些修改并制作了更多的 OO 风格,所以这里是:
class Node {
String data;
Node next, previous;
}
public class SortedDLL {
private Node first;
private Node last;
private int size = 0;
public SortedDLL() {
size = 0;
first = new Node();
last = new Node();
first.next = last;
last.previous = first;
}
public void addElement(String element) {
Node newNode = new Node();
newNode.data = element;
if (size == 0) {
first.next = newNode;
newNode.previous = first;
newNode.next = last;
last.previous = newNode;
} else {
Node node = first;
while (node.next.data != null && node.next.data.compareTo(newNode.data) < 0) {
node = node.next;
}
newNode.next = node.next;
node.next.previous = newNode;
node.next = newNode;
newNode.previous = node;
}
size++;
}
public void print() {
Node node = first;
while (node != null) {
System.out.print(node.data != null ? node.data + " " : "null ");
node = node.next;
}
}
public void printReverse() {
Node node = last;
while (node != null) {
System.out.print(node.data != null ? node.data + " " : "null ");
node = node.previous;
}
}
public static void main(String[] args) {
SortedDLL sortedDLL = new SortedDLL();
sortedDLL.addElement("c");
sortedDLL.addElement("a");
sortedDLL.addElement("b");
sortedDLL.addElement("c");
System.out.println("list: ");
sortedDLL.print();
System.out.println("\nlist reverse: ");
sortedDLL.printReverse();
}
输出:
list:
null a b c c null
list reverse:
null c c b a null
TA贡献1788条经验 获得超4个赞
当 size == 0 时,问题从第一次调用开始
您将第一个 null 推到最后.. 第一个节点成为新节点。
然后,如果您解决此问题,您将在该行获得空指针异常:
if (current.data.compareTo(element) > 0) {
因为 current 将是 null 并且不会有数据。
您应该忽略第一个插入中的第一个 null 以及之后的每个插入。
TA贡献1803条经验 获得超3个赞
根据实施情况,我认为您只是在错误的地方做正确的事。
while (current != null) {
if (current.next == null) {
newNode.next = null;
newNode.previous = current;
current.next = newNode;
break;
}
if (current.next.data.compareTo(element) > 0) {
newNode.next = current.next;
newNode.previous = current;
current.next.previous = newNode;
current.next = newNode;
break;
} else {
current = current.next;
}
}
而不是检查当前选择的节点是否更小,您需要检查之后的节点是否更大,因为这样您就可以放置节点。并且检查 current.next 是否为 null 需要在该比较之外进行。
添加回答
举报