1

二重にリンクされたリストの問題を説明しようとしています。これは私が最近勉強している古いテストからのものです。

質問は次のとおりです。

このコードの後に​​最終的にリンクされたものを描画します:

ListNode n1 = new ListNode();
ListNode n2 = new ListNode();
ListNode n3 = n1;
n1.next = n2;
n3.prev = n1;
n1.next.prev = n3.next;

私が迷子になるのは、コードの最後の行です。

n1.next.prev = n3.next;

ここに解決策があります:

http://www.imagechicken.com/viewpic.php?p=1242322384048558300&x=jpg

誰かがこれを説明したり、私を良い方向に導いたりできますか?

4

5 に答える 5

4

ステップ 1: リンクされていない 2 つのノード。n1としても知られていn3ます。

      +------+次へ +-------+次へ
      | | +----> | +---->
  前へ| n1 | 前へ| n2 |    
 <----+ n3 | <----+ |   
      +------+ +-------+   

ステップ2:n1.next = n2;

      +------+次へ +-------+次へ
      | | +--------->| +---->
  前へ| n1 | 前へ| n2 |    
 <----+ n3 | <----+ |   
      +------+ +-------+   

ステップ 3:はであるn3.prev = n1;
ため、これで矢印が向きを変えます。n3n1

      +------+次へ +-------+次へ
      | | +--------->| +---->
  前へ| n1 | 前へ| n2 |    
 /----+ n3 | <----+ |   
 \--->+------+ +-------+   

ステップ 4:は、はでn1.next.prev = n3.next;
あることを思い出してください。矢印に従ってください:n1.nextn2n3n1

      +------+次へ +-------+次へ
      | | +--------->| +---->
  前へ| n1 | 前へ| n2 |    
 /----+ n3 | /----+ |   
 \--->+-------+ \--->+-------+   

したがって、と両方のprevポインターは、最終的に自分自身を指すことになります。n1n2

于 2009-05-14T16:48:19.087 に答える
3

これの鍵は、n1 と n3 が同じ ListNode を指していることです。

3 つの操作のそれぞれの後の状態を次に示します。

n1.next = n2;
// n1.prev = null;
// n1.next = n2;
// n2.prev = null;
// n2.next = null;
// n3.prev = null;
// n3.next = n2;

n3.prev = n1;
// n1.prev = n1;
// n1.next = n2;
// n2.prev = null;
// n2.next = null;
// n3.prev = n1;
// n3.next = n2;

n1.next.prev = n3.next;
// n1.prev = n1;
// n1.next = n2;
// n2.prev = n2;
// n2.next = null;
// n3.prev = n1;
// n3.next = n2;

したがって、最後のステートメントでn3.nextは、 は と同じです。n1.nextこれはn2です。したがって、最後のステートメントは settings と同等n2.prev = n2です。

于 2009-05-14T16:43:56.163 に答える
0

申し訳ありませんが、画像から表と裏を区別できませんでした。

n1.next = n2. したがって、n1.next.prev は n2.prev に評価されます。

n3 = n1。したがって、n3.next は n1.next に評価されます。

n2.prev を n1.next に設定しています。

于 2009-05-14T16:47:54.203 に答える
0

箱を3つ描いてみました。各ボックスを 3 分割します。3 分の 1 をラベル、3 分の 1 を「前」、3 分の 1 を「次」にします。次に、すべての「前」と「次」から適切なラベルに接続線を引いて、物事がどのようにリンクされているかを確認します。

写真は千の言葉に値することがあります。

于 2009-05-14T16:43:26.507 に答える
0

ListNode のインスタンスが 2 つしかないことに気付くまで、この種のことは混乱を招きます。n1、n2、および n3 はすべて、これらのインスタンスを参照しています。特に、n1、n2、および n3 の値は一度だけ設定されます。n3 の値は n1 に設定されているため、このコードでは n3 を n1 に簡単に置き換えることができ、同じように機能します。

于 2009-05-14T16:45:53.927 に答える