0

これは、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));
    }

}
4

3 に答える 3

1

最初のステートメントでは、while ループは次のようになります。

while(curr != null && x.compareTo(curr.getData()) >0 )

x.compareTo(curr.getData()) を呼び出すと、5 が null と比較され、1 が返されます。これは 0 より大きいため、要件の半分は true ですが、while ループをスキップして次の処理に進みます。

 if (prev == null) {
        head = new ListNode(x, curr);

このアクションは head に値を与え、null ではなくなります。だから、あなたが2回目の挿入をするとき、あなたはそうします

ListNode curr = head;

今回は curr が null ではないため、ループに入ることができます

于 2013-03-17T00:20:49.940 に答える