0

私はこの仕事で輪になって回っているようです。それを引き出すことでさえ、私に実用的な解決策を与えていないようです。誰かが私の思考プロセスがここで崩壊する場所を見つけるのを手伝ってもらえますか?

// method receives node ins to be inserted
// and node prev in front of which ins should be inserted
public void insertIntermediate(DLLNode ins, DLLNode prev)
{
    ins.pred = prev ; // update node ins' predecessor information
    ins.succ = prev.succ ; // update node ins' successor information 
    prev.succ = ins ; // update list's information
    prev.succ.pred = ins ; // update list's information
}

[EDIT2](混乱を減らすためにedit1を削除しました)

@ Andrew、わかりました。わかりました。上記の問題は3行目と4行目の順序でした。

3行目でprev.succ.predにアクセスできなくなりました。

2行を入れ替えることで、その問題を解決しました。ヒントをありがとう!

アドオンの質問:

しかし、別の奇妙な問題に遭遇しました。そのため、解決策を見つけるのに多くの時間を失いました。既存の要素を再度挿入すると、何らかの理由で、印刷時にすべてが無限ループに陥ります...例:

myList.addBeforeFirst(B) ;
myList.addBeforeFirst(B) ;

ループが発生しますが、次のようになります。

myList.addBeforeFirst(B) ;
myList.addBeforeFirst(C) ;

正常に動作します

方法は次のとおりです。

public void addBeforeFirst(DLLNode ins)
{
    ins.succ = first ;
    ins.succ.pred = ins ;
    first = ins ;
}

およびノー​​ド:

DLLNode B = new DLLNode("Hi", null, null) ;
DLLNode C = new DLLNode("Salut", null, null) ;

なぜそれが起こっているのですか?

4

1 に答える 1

1

これは二重にリンクされたリストですよね?どういう意味ですか?関連するすべてのリンクを正しい順序で更新していることを確認してください。また、関連するすべてのノードが存在することを確認してください。

編集:

ステートメントを順番に見ていきましょう。

開始する前prevに、プロパティsuccが後続ノードを指しているがあります。(または、それはありますか?例外がありますか?そのような例外をどのように処理しますか?存在する場合) は、後続ノードを指す場合prev.succ.predと同じである必要があります。prevprev.succ

ここで、最初の2つのステートメントがとを設定ins.predins.succます。これは基本的に正しい考えですが、上記の私の質問を参照してください。

ここで、に設定prev.succinsます。このステートメントに焦点を当てます。失くした情報はありますか?では、次のステートメントは正確に何をするのでしょうか?それはあなたが意図したものですか?

これは、解決策を完全に提供することなく私ができる最善のことだと思います。

無限ループの問題を編集します。

あなたが抱えている問題は、値によるパラメータの受け渡しと参照によるパラメータの受け渡しの違いです。参照によって渡すため、同じオブジェクト(B)への参照を2回渡しました。つまり、次のことを行うことになります。

最初の呼び出し:

B.succ = first;
B.succ.pred = B; /* why not just first.pred = ins? */
first = B;

これで、最初はBに設定されます。したがって、Bを使用して2番目の呼び出しを行います。

B.succ = B;
B.succ.pred = B; /* so, now B is its own pred and succ */
first = B; /* no change here */

したがって、ここで、firstはB、first.succはB、first.succ.succはBなどであるため、無限ループになります。

于 2011-03-21T22:03:50.810 に答える