3

これは宿題です。次の再帰的なディープ コピー メソッドを反復的な同等のメソッドに変更します。私は近づいてきました、そしてそれを正しくするためにあなたの助けが必要です. 再帰的な実装:

public static StringNode copy(StringNode str) {
        if (str == null)
            return null;

        StringNode copyFirst = new StringNode(str.ch, null);
        copyFirst.next = copy(str.next);
        return copyFirst;
    }

これが私が思いついたもので、反復の同等物です。このstatic length()メソッドは、指定されたリンク リストに含まれるノードの数を返すように既に実装されています。

public static StringNode copy(StringNode str) {
    if (str == null)
        return null;

    StringNode firstNode = new StringNode(str.ch ,null);
    StringNode prevNode = firstNode;
    StringNode nextNode;

    for (int i = 1; i < length(str); i++) {
        nextNode = new StringNode(str.next.ch, null);
        prevNode.next = nextNode;
        prevNode = nextNode;
    }

    return firstNode;
}

str1問題: 実装をテストするために、文字値 を含むリンク リストを作成し'n', 'b', 'a'、 を呼び出します。

StringNode copy = StringNode.copy(str1);

次に、str1 の最後のノードを削除し、そのままにしておきます。'n','b', ただし、コピーに保存されているコンテンツを印刷しようとすると、 'n', 'b', 'b'代わりに'n', 'b', 'a'.

助言がありますか?

4

1 に答える 1

4

また、ループ内で前方に移動する必要があります。そうしないと、繰り返しごとにstr継続的に追加さsame strれます。listメソッドの最初の呼び出しでは、最初の要素が異なります。その後str.next、ループ全体で同じです。

したがって、このコードを for ループに追加する必要があります: -

str = str.next;

また、ループに問題があります。まで繰り返すべきではありませんlength(str)。しかし、までstr == null

したがって、最終的にループは次のようになります。

while (str.next != null) {  // Iterate till str.next != null, as we are creating 
                            // the next node in the loop for current node str

    nextNode = new StringNode(str.next.ch, null);
    prevNode.next = nextNode;
    prevNode = nextNode;

    str = str.next;  // Move to next node.
}

この場合、ループを何回繰り返す必要があるかわからないため、while ループを使用する必要があります。

于 2012-11-06T06:58:22.763 に答える