1

一般的な順序付きリンク リスト クラスがあります。何らかの理由で、add() を実行するたびに LinearNode ヘッドが再割り当てされます。何か案は?これを実行するたびにヘッドが変更されるのはなぜですか? 私もそれに触れていません。必要に応じて、テスト用に他のクラスを提供できます。

 public class myOrLiList<T extends Comparable<T>> {

public LinearNode head;
public int count;

public myOrLiList() {
    head = null;
    count = 0;

}

// LinearNode INNER CLASS
public class LinearNode {
    public LinearNode next;
    public T item;

    public LinearNode(T thisitem) {
        this.next = null;
        this.item = thisitem;
    }

}
public boolean isEmpty() {
    return (head == null);
}
public void add(T thisItem) {

    LinearNode newNode = new LinearNode(thisItem);

    if (isEmpty()) {
        head = newNode;
        System.out.println("head filled!");
    } else {
        LinearNode compareNode = head;
        do {
            if (thisItem.compareTo(compareNode.item) < 0) {
                newNode.next = compareNode;
                break;
            } else if ((thisItem.compareTo(compareNode.item) < 0)
                    || (thisItem.compareTo(compareNode.item) == 0)) {
                newNode.next = compareNode.next;
                compareNode.next = newNode;
                break;
            } else {
                compareNode = compareNode.next;
            }
        } while (compareNode.next != null);
    }
    System.out.println("Added!");
    count++;
}

ご協力いただきありがとうございます。

4

2 に答える 2

1

あなたheadが変わっている理由はこの行のためです:

compareNode = compareNode.next;

以前にこれを行いました:

LinearNode compareNode = head;

あなたは文字通りそれがcompareNodeあなたの頭の対象だと言っています。headを指すオブジェクト参照を。も指すように設定していますcompareNode。実行するアクションは、まったく同じようcompareNodeに影響します。head

compareNode = headを設定したため、これら2つの行は同じオブジェクト参照に対して同じことを行います。

compareNode.next = null;
head.next = null;

他にもいくつか間違っていることがわかります。一つずつ調べてみます。

LinkedListが空の場合のロジックは正しいようです...

でも、

リストのサイズが1のときに2番目のノードを追加すると、いくつかの問題が発生します...

if (thisItem.compareTo(compareNode.item) < 0)このコードを呼び出してから、次のように記述します。

newNode.next = compareNode;
break;

その後、newNodeで何をしていますか?答えは何もありません。更新しなかったためhead、何も変更されていません。を作成し、その値をに等しくLinearNode設定してから、そのままにしておきます。nexthead

私がやりたいと思うのは、に保存されている古いノードへの参照を取得し、それを保存してから、変数を新しいノードと等しくhead設定することです。head次に、newNode.next(newNode現在はhead)を、保存したOLDヘッドノードと同じに設定します。したがって、次のようなものになります。

LinearNode oldHead = head;
head = newNode;
head.next = oldHead;

次のパートに移りましょう。あなたは

if ((thisItem.compareTo(compareNode.item) < 0) || (thisItem.compareTo(compareNode.item) == 0))

すでにケースをカバーしてcompareNode.item < 0いるのに、なぜもう一度チェックするのですか?ロジックを台無しにすることはありませんが、冗長です。

基本的に、実行しようとしているのは、現在のノードが0未満の場合はnewNodeを現在のノードの前に配置し、0より大きい場合は現在のノードの後に​​newNodeを配置し、currentElementが終了した場合は置換するか何もしないことです。 ==0になります。

<0のケースについて説明したので、より大きいケースと等しいケースを実行する方法を試してみてください。

于 2012-10-24T22:17:06.520 に答える
1

このクラスにはいくつかのエラーがありますが (ヒントをありがとう、Michael!)、私が尋ねた質問はこれらのエラーによるものではありませんでした。

T 用に作成した新しいオブジェクト クラスでは、静的プロパティを宣言しました。そのため、新しい T thisItem が作成されるたびに、すべてのオブジェクトのすべてのプロパティが変更されていました。

于 2012-10-25T14:16:24.570 に答える