0

リンクリストと非常によく似た機能を持つLinkStrandというクラスがあります。、、、、、、がありますが、toString()メソッドはありませ。ノードの順序と各ノード内の文字列を逆にするコードを書き込もうとしています。私が書かなければならなかった他のいくつかのメソッドで自分自身を簡単にするために、ノードを構築する際の次のノード要件を取り除きました。Nodeクラスは次のようになります。size()append()next()value()previous()

private class Node {
    public Node myNext;
    public String myData;

    Node(String value) {
        myData = value;
        //myNext = next;
    }   
}

私の.reverse()メソッドは現在、ノード内のすべての文字列を個別に逆にしますが、ノード自体の順序は逆にしません。以下にコピーされます:

public IDnaStrand reverse() {
    if (this == null)
        return this;
    Node prevStrand = null;
    Node thisStrand = myHead;
    String revString;
    LinkStrand val = new LinkStrand();
    while (thisStrand != null){
        Node hold = thisStrand.myNext;
        if (revSave.containsKey(thisStrand.myData)){
            revString = revSave.get(thisStrand.myData);
            val.append(revString);
            //System.out.println("Val is: " + val);
        }
        else{
            revString = reverseStr(thisStrand.myData);
            val.append(revString);
            //System.out.println("Val is: " + val);
            revSave.put(thisStrand.myData, revString);
        }
        thisStrand.myData = revString;
        thisStrand.myNext = prevStrand;
        prevStrand = thisStrand;
        thisStrand = hold;
    }
    return val;
}

ノードの順序を逆にするための何らかの方法を考え出そうとしてきましたが、空白を描画しています。誰かが私がそれについてどうやって行くのか考えていますか?

ありがとう!

4

3 に答える 3

2

IDnaStrandおよびの変更が許可されている場合はLinkStrand、メソッドを追加しprepend(Node n)ます。次に、リストを反復処理するときに、各ノードを先頭に追加します。

クラスを変更できない場合は、 s をの順序 ( 、 、...)Nodeで配列に保存してから、配列を順番に通過する新しい を作成します。または、配列を順番にロードしてから、の順序で作成することもできます。nodeArray[size-1]nodeArray[size-2]LinkStrandLinkStrand

例:

thisStrand = myHead;
int size = 0;
while(thisStrand != null){
    thisStrand = thisStrand.myNext;
    size++;
}
Node[] nodeArray = new Node[size];
thisStrand = myHead;
for(int i = size-1, i < 0; i--) {
    nodeArray[i] = thisStrand;
}

これで配列ができました。それを新しいリストにロードするだけです! もちろん、prepend メソッドを追加する方が良いでしょう。クラスに実行させるだけです。

newElement.myNext = MyHead;
MyHead = newElement;
于 2012-10-26T10:42:29.727 に答える
1

元のインスタンスを通る新しいインスタンス ループを作成し、新しいインスタンスの位置 0 に挿入してから返します。

他の方法はソートすることですが、質問には現在ソートされていることを示すものは何も表示されません。

于 2012-10-26T10:40:23.350 に答える
0

リストが次のようになっているとします。

A -> B -> C -> D -> E

これをたくさん書くので、表記を短くします。

A B C D E

変数を 3 つ取りましょう。何が起こっているかを確認できるように、リスト全体を表示します。最初の項目は、常に変数の 1 つに格納されているノードです。

list: null
curr: A B C D E
next: B C D E

A の next-pointer をlist(null) の値に設定します。これでリストは終わりです。

list: null
curr: A
next: B C D E

では、次に進みます。

list: A
curr: B C D E
next: C D E

何が起こるかを見ることができます。開始したとおりに続行します。次のポインターを に設定currlistます。

list: B A
curr: B A
next: C D E

前進:

list: B A
curr: C D E
next: D E

また:

list: C B A
curr: C B A
next: D E

等々...

疑似コードはかなり単純です。

list = null
curr = original_list

while next != null
    next = curr->next
    curr->next = list
    list = curr
    curr = next
end

これが実際に行っていることは、リストの先頭から各ノードを取得し、それを他のリストの先頭にすることだけです。これは順序を逆にする効果があります。私の答えは少し長文かもしれませんが、あなたがすることはそれだけです。

于 2012-10-26T10:47:21.680 に答える