以下代码确保元素以排序方式插入链接列表中。
在理解了背后的逻辑后,我决定自己测试它。但是,当我编写我的代码版本时,如下所示。
public class SortedList {
private Node first;
public SortedList() {
first = null;
}
public boolean isEmpty() {
return first == null;
}
public void insert(int j) {
Node newNode = new Node(j);
Node previous = null;
Node current = first;
while (current != null && j > current.iData) {
previous = current;
current = current.next;
}
if (previous == null)
first = newNode;
else
newNode.next = current;
previous.next = newNode;
}
public Node remove() {
Node temp = first;
first = first.next;
return temp;
}
public void displayList() {
System.out.println("First to -----> Last");
Node current = first;
while (current != null) {
current.display();
current = current.next;
}
}
}
NODE CLASS
public class Node {
public int iData;
public Node next;
public Node(int id) {
iData = id;
}
public void display() {
System.out.println(iData + " ");
}
}
TEST CLASS
public class SortedListApp {
public static void main(String[] args) {
SortedList list = new SortedList();
list.insert(20);
list.insert(40);
list.displayList();
list.insert(10);
list.insert(30);
list.insert(50);
list.displayList();
list.remove();
list.displayList();
}
}
两者之间的唯一区别是在我的版本中while循环终止。我首先将newNode的下一个值设置为当前值,然后将新节点的上一个值设置为。在发布的原始代码中,它们已经颠倒了。由于某种原因,这会抛出Null Pointer Exception。我想知道为什么?
据我所知,一旦新节点找到了插入的位置。我们引用了前一个节点和当前节点,我们试图将新节点插入到前一个节点和当前节点的中间。因此,我所做的是将新节点的下一个设置为当前节点,然后将前一个节点的下一个节点设置为新节点。
请告诉我哪里错了。
答案 0 :(得分:2)
当previous
为空时跟踪此代码:
if (previous == null)
first = newNode;
else
newNode.next = current;
previous.next = newNode;
请注意,您从未真正更改过previous
语句中的if
,因此会尝试编写next
null
字段,从而导致崩溃。
如果previous
为空,那么您需要将该节点添加到列表中,在这种情况下,您需要做的就是将first
设置为newNode
并使{{1}下一个指针指向旧列表。在newNode
不是previous
的情况下,您需要进行两次重写:您需要将null
指向新节点并指向新节点&#39}。下一个指向当前节点的指针。您可以通过编写
previous.next
等效地:
if (previous == null) {
newNode.next = current;
first = newNode;
}
else {
newNode.next = current;
previous.next = newNode;
}
希望这有帮助!