1

これはかなり基本的な質問ですが、私は一生それを理解することはできません。インストラクターから提供された2つのファイルを使用していremoveFirstます。宣言されたリンクリストからヘッドを削除し、その古いヘッド値を返すメソッドを作成する必要があります。パラメータを取ることはできません。これがファイル1ファイル2です。

removeFirstとデバッグのコードは以下のとおりです。aList特にリンクリストがグローバルではないため、パラメータとして使用できずに参照する方法がわかりません。デバッグコードを使用すると、印刷してaListから印刷します21(削除する必要のあるリストの先頭であり、これがremoveFirst返される必要があります)が、更新されたリンクリストは印刷されません。空白になります。

removeFirstコード:

public IntNode removeFirst() {
    IntNode cur = getHead();

    head = cur.getNext();
    head.setPrev(null);

    cur.setNext(null);

    return cur;
}

デバッグコード(下部main):

for(int i = 0; i < aList.size(aList.getHead()); i++) {
    aList.print(aList.findObject(i));
}

aList.print(aList.removeFirst());
System.out.println("");

for(int j = 0; j < aList.size(aList.getHead()); j++) {
    aList.print(aList.findObject(j));
}
4

3 に答える 3

6

あなたはreturn head;代わりにする必要がありますreturn cur;

編集ごめんなさい。私は明らかにあなたの問題の記述を誤解しました。メソッドがリストの新しい先頭removeFirst()を返すことになっている場合は、上記が適切です。削除された要素を返すことになっている場合(コメントと元の投稿の編集の後で明らかなように)、正しく機能しているはずです。

おそらくremoveHead()、リストクラスのインスタンスメソッドです。thisリストはメソッド内で使用できるため、パラメーターを渡す必要はありません。

のクラス定義を確認すると役立ちますaList。あなたのfile 1リンクはそれがMyLinkedList.javaにあると言っていますが、そこに貼り付けられたコードはIntNode.java用です。

編集2問題は、デバッグコードにあると思います。リストのthfindObject(j)要素を返しません-値として含まれているリスト要素を返します。コードからは、指定されたノードからリスト全体を印刷しているように見えます。デバッグコードのループを単純に置き換えるとどうなりますか?jjMyLinkedList.print(IntNode)for

aList.print(aList.getHead());
于 2012-11-09T16:45:53.537 に答える
1

帰り以外は大丈夫だと思います。削除されたノード(前のノード)を表すasheadの代わりに戻る必要があります。curcurhead

public IntNode removeFirst() {
    IntNode cur = getHead();

     head = cur.getNext();
     head.setPrev(null);

     cur.setNext(null);

     return head;
 }

編集:あなたはあなたの質問を更新したので、ここにあなたの2番目の質問の答えがあります。

演算子をaList使用して参照できます。this

更新:クラスにremoveFirst()メソッドMyLinkedListをそのまま追加し、次にこれら2つのステートメントをメソッドに追加しました(最後に)

    aList.removeFirst();
    aList.print(aList.getHead());
    System.out.println("");

正しく動作し、出力を次のように出力します。

    84 88 92 96 100 
    100 96 92 88 84 
    Size = 5
    Adding another IntNode
    21 84 88 92 96 100 
    Adding yet another IntNode
    21 52 84 88 92 96 100 
    The object is 92
    The object containing 50 was not found.
    The object removed has 96 in it.
    The object containing 50 was not found. Nothing was removed.
    21 52 84 88 92 100 
    Removing Head
    52 84 88 92 100 
于 2012-11-09T16:47:57.593 に答える
1

私の仮定では、参照によってすべてのオブジェクトにアクセスしているため、実行すると基本的にリストが破棄されます。removeFirst()

IntNode cur = getHead();

と同じ

cur = head;

同じスコープでアクセスできるため。実行時にこれを行うことにより:

head.setPrev(null);
...
cur.setNext(null);

あなたは基本的にこれをやっています:

head.setPrev(null);
...
head.setNext(null);

また....

null <-- head --> null

これがどこに向かっているのか分かりますか?

目的としているのは、削除するノードのコピーを取得してから、そのコピーのリストへの参照を破棄することです。

IntNode cur = new IntNode(getHead().getVal());

ノードから古いヘッドを削除しようとしている場合:

head.setNext(head.getNext());
head.setPrev(null);
于 2012-11-09T17:07:57.017 に答える