2016-10-06 11 views
0

Iは、例えば、単独でリンクされたリスト を横断ている:それは位置に到達すると、5-> 6>コレクションを使用せずにリンクリストを逆順にする方法はありますか?

1-> 2-> 3-> 4->ノードの値4と言う、それが戻る前に来ています1または2のような位置の値を返します。コレクションフレームワークを使用せずに、リンクされたリストを逆にして逆方向にそれをトラバースする方法はありますか?

+0

これは単重リストですか? – Eran

+0

単独でリンクされたリスト –

+1

@SuryaPrakashそれではできません。それを行う方法はありません。あなたが行くように新しい逆リンクされたリストを構築するのは間に合わず、不自由ではありませんか?しかし、真剣に、それはその操作をサポートするデータ構造ではありません。 –

答えて

0

この答えは、あなたがあなた自身の単独リンクリストクラスを実装し、それは次のような実装されていることをされている前提としていますSingly Linked List in Java

は、あなたのリンクリストクラスにフィールドを追加します(またはクラスを拡張)現在のインデックスをで表しますあなたのリスト。構築時に、そのインデックスが0に設定されているとします。次に、前述のインデックスを調べ、増減して新しいインデックス位置にオブジェクトを戻すメソッドgetNextObject()とgetPreviousObject()を追加します。

編集

これはあなたの実際のクラスを知らずに作成した例であり、インデックスが範囲外であるかどうかをチェックしませんのでご注意ください。

public class LinkedListTraverser{ 
    private IMyLinkedList myLinkedList; 
    private int internalIndex; 

    public LinkedListTraverser(){ 
     this.internalIndex = 0; 
     // your linked list class, you can pass data as constructor parameters for example 
     this.myLinkedList = new LinkedList(); 
    } 

    public object getObjectAt(int index){ 
     this.internalIndex = index; 
     return myLinkedList.getObjectAt(index) 
    } 

    public object getNext(){ 
     return myLinkedList.getObjectAt(++internalIndex); 
    } 

    public object getPrevious(){ 
     return myLinkedList.getObjectAt(--internalIndex); 
    } 
} 

は今、あなたはこのようなあなたのリンクリストを反復処理することができます:

public interface IMyLinkedList{ 
    object getObjectAt(int index); 
} 

あなたは、このようなクラスのLinkedListTraverserを作成することができます。

は、あなたのLinkedListクラスがインターフェイスを実装することができますと言うことができます

LinkedListTraverser linkedListTraverser = new LinkedListTraverser(); 
object myObject; 

while(goForward){  
    if(shouldGoForward){  
     myObject = linkedListTraverser.getNext(); 
    }else{ 
     myObject = linkedListTraverser.getPrevious(); 
    } 

    doWorkOnObject(myObject); 
} 
-1
LinkedList yourObject = .... ; 
int desire = 4; //Enter Your Desire Digit 
for(int a = 0; a < yourObject.Length; a++){ 
if(yourObject.get(a) == desire){ 
for(int b = desire; b = 0; b--){ 
System.Out.Println(yourObject.get(b)); 
} 
break; 
} 
} 
+0

質問に「コレクションを使用しないで」と明記されています。 – progyammer

+0

いくつかのコードを書いてよかったですが、変更点を指摘するために何らかの説明が必要で、なぜOPの質問の解決策なのでしょうか。そしてprogy_rockが言ったように、OPはCollectionなしで尋ねます、そしてLinkedListはCollectionの一部です。 –

1

これは配列の場合と同様に、つまりループを使用して行うことができます。あなたが必要とするのは始めと終りの指標だけです。私はdisplayReverse()というメソッドを定義し、位置の間のノードの整数をabの順に逆順に表示します。 は(注:a、bは位置とNOT インデックスを示していることは、あなたのケースでは意味、1は位置1である。。)

public void displayReverse(int a, int b){ 
    //Node t holds the node at the beginning index 
    Node t = start; 
    for(int i=2; i<=a; i++) 
     t=t.link; 

    for(int i=b; i>=a; i--){ 
     Node x = t; 
     int s = a; 
     while(s<=i && x.link != null) { 
      if(s != a) 
       x = x.link; 
      s++; 
     } 
     System.out.print(x.d + " "); 
    } 
} 

あなたがポジション4(すなわち、インデックスから表示したい場合3)から位置1(インデックス0)に移動するには、メインメソッドから

myLinkedList.displayReverse(1,4); 

とする必要があります。あなたのケースでは、出力はあなたがそれを表示するよりも何かをしたい場合は、対応する文で私のコードでprint文を置き換える

4 3 2 1 

EDIT

  1. する必要があります(s)。

  2. abの値がリンクリストのインデックス範囲内にあることを確認してください。

関連する問題