4

自分のスキルをテストするためだけに、Java を使用して LinkedList を実装しようとしています。私は、作成した 2 つのリンクされたリストを追加する必要があるという 1 つの問題で立ち往生しています。ここで無限ループに陥ります。コードを改善して目的の出力を実装する方法はありますか?

I/P :

リスト A : 4->3->2->1->0

リスト B : 4->3->2->1->0

O/P : 4->3->2->1->0->4->3->2->1->0

class List {
    int val;
    List next;

    public List(int val) {
        this.val = val;
    }

    public String toString() {
        String output = "";
        List current = this;

        while (current != null) {
            output += current.val + "->";
            current = current.next;
        }
        return output + "NULL";
    }
}


class AppendLinkedLists {

    static List push(List list, int num) {
        List newList = new List(num);
        newList.next = list;
        return newList;
    }

    static List appendLists(List listA, List listB) {
        if (listA == null)
            return listB;
        else {
            List tempList = listA;
            while (tempList.next.next != null) {
                tempList = tempList.next;
            }
            tempList.next.next = listB;
            return listA;           
        }
    }

    public static void main(String[] args) {
        List listA = new List(0);
        listA = push(listA, 1);
        listA = push(listA, 2);
        listA = push(listA, 3);
        listA = push(listA, 4);

        List listB = listA;

        System.out.println("Input List A : " + listA.toString());
        System.out.println("Input List B : " + listB.toString());
        listA = appendLists(listA, listB);
        System.out.println("Combined Input Lists A and B : " + listA.toString());
    }
}
4

5 に答える 5

5

2 つのリストがありません。あなたは1つしか持っていません。

   List listB = listA;

listBポイントへの参照を に割り当てlistAます。したがって、listAそれ自体に追加しています。

他にどのような問題があるかに関係なく、これを修正します (最も簡単な方法は、作成したlistB方法と同様の方法で を作成することですlistA)。

私の他のコメント (気にしないでください) は、List オブジェクトを作成しましたが、それ自体の動作はほとんどまたはまったくないということです。AppendLinkedListsクラスを作成する代わりに、次のList代わりに機能をオブジェクトに入れます。

listA = push(listA, 1);

書きます:

listA.push(1);

など。したがって、動作は List object内にカプセル化されます。同様に、次のように記述できます。

listA.push(listB);

オーバーロードを利用して。

于 2012-09-27T10:07:09.470 に答える
2

追加コードのロジックがわかりません..

しかし、あなたの問題は

リスト listB=listA;

これはあなたが期待していることをしていません。新しいlistBを作成してください。listA の内容を listB にコピーします。むしろ、新しい listB を作成し、listA の参照 ID を listB にコピーします。つまり、リストは listA の 1 つだけです。

まずこれを修正

于 2012-09-27T10:11:42.917 に答える
1

あなたは と の 2 つのリストがあると言いlistAましたlistBが、電話をかけnewたのは 1 回だけです。

List listA = new List(0); 

新しいリストを作成し、それlistAを指します。

List listB = listA; 

指してlistBいる同じリストをlistA指します。

したがって、別のリストも作成する場合は、作成した方法と同じ方法で作成しますlistA

于 2012-09-27T10:11:53.180 に答える
0

listA は listB と同じリストであるため、無限ループに陥っています。サイクルを作成したため、 toString は決して終了しません。実際には (架空の) フィールド listA.End.next は listA.Start を指します。

listB を再作成するか、実際に listA をコピーする必要があります。

于 2012-09-27T10:09:09.677 に答える
0

あなたが直面している問題は、 ListA と ListB が実際には同じリストであるため、一方を変更すると、もう一方も変更されることだと思います。したがって、ListB を ListA に追加すると、実際には ListA を ListA に追加することになり、無限リストになります。

問題は次の行にあります。

List listB = listA;

何をしたかというと、ListA が指しているのと同じリストに 2 番目のポインター (ListB) を割り当てます。

これを修正するには、ListA の実際のコピーを作成する必要があります。あなたが自分のスキルをテストしようとしていることを考えると、正確な「方法」は演習として残しておきます;)

于 2012-09-27T10:09:21.073 に答える