これは、SortedList クラスを理解する能力の欠如に関するものです。私が理解しているListNode:それは2つのもので構成されるノードです:同等のオブジェクトと、それ自体が同じ2つのものを持つListNodeオブジェクト。
下の SortedList クラスで挿入および削除メソッドがどのように機能するかわかりません。理解するのは非常に複雑です。SortedList クラスでは、ヘッドが null の場合、curr を指します。curr は null であってはなりませんか? その場合、while ループは実行されませんが、実際には println を使用して実行をテストすると実行されます。
ListNode クラスのコード:
public class ListNode {
private Comparable data;
private ListNode next;
public ListNode() {
data = null;
next = null;
}
public ListNode(Comparable x) {
data = x;
next = null;
}
public ListNode(Comparable x, ListNode nextListNode) {
data = x;
next = nextListNode;
}
public Comparable getData() {
return data;
}
public ListNode getNext() {
return next;
}
public void setData(Comparable x) {
data = x;
}
public void setNext(ListNode nextListNode) {
next = nextListNode;
}
}
SortedList のコード:
public class SortedList {
private ListNode head;
public SortedList() {
head = null;
}
public void insert(Comparable x) {
ListNode curr = head, prev = null;
while (curr != null && x.compareTo(curr.getData()) > 0) {
prev = curr;
curr = curr.getNext();
}
if (prev == null) {
head = new ListNode(x, curr);
} else {
prev.setNext(new ListNode(x, curr));
}
}
public boolean delete(Comparable x) {
if (head == null) {
return false;
}
ListNode curr = head, prev = null;
while (curr != null && x.compareTo(curr.getData()) > 0) {
prev = curr;
curr = curr.getNext();
}
if (curr == null || x.compareTo(curr.getData()) != 0) {
return false;
}
if (prev == null) {
head = curr.getNext();
} else {
prev.setNext(curr.getNext());
}
return true;
}
public void output() {
for (ListNode curr = head; curr != null; curr = curr.getNext()) {
System.out.println(curr.getData());
}
}
}
TestSortedList のコード:
public class TestSortedList {
public static void main(String[] args) {
SortedList list = new SortedList();
list.insert(5);
list.insert(1);
list.insert(10);
list.insert(3);
list.insert(7);
list.output();
System.out.println(list.delete(5));
System.out.println(list.delete(5));
System.out.println(list.delete(1));
System.out.println(list.delete(10));
System.out.println(list.delete(11));
}
}