1

可能な方法が何であれ、どうすればこれを行うことができますか? 実際のリスト自体を変更するメソッドが必要です。私はこれをやってみました:

// Reverses this list.
public void reverse() {
    for (int i = 0, j = size - 1; i < size && j >= 0; i++, j--)
        set(i, get(j));
}

...しかし、私は失敗しました。途中で最初からやり直して、私はただ吸っています。出力は次のようになります。

List:       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
Reversed:   [24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]

真ん中に達したら数字を繰り返すというこの問題をどのように回避できますか? ありがとう。

4

2 に答える 2

1

様、

私はこれを行うことができました。独自のロジックを追加して、私が使用した for ループを減らすことができます。しかし、それが何らかの形で役立つことを願っています。

    for(int i=0;i<list.size()/2;i++) {
        int val = list.removeLast();
        System.out.println("i:" + i + " val " + val);
        reverseList.add(val);
    }

    for(int i=list.size()/2;i<list.size();i++) {
        int val = list.removeLast();
        System.out.println("i:" + i + " val " + val);
        reverseList.add(val);
    }

    for(int i=list.size()/4;i<list.size();i++) {
        int val = list.removeLast();
        System.out.println("i:" + i + " val " + val);
        reverseList.add(val);
    }

    for(int i=list.size()/6;i<list.size();i++) {
        int val = list.removeLast();
        System.out.println("i:" + i + " val " + val);
        reverseList.add(val);
    }

    for(int i=list.size()/8;i<list.size();i++) {
        int val = list.removeLast();
        System.out.println("i:" + i + " val " + val);
        reverseList.add(val);
    }

    for(int i=list.size()/10;i<list.size();i++) {
        int val = list.removeLast();
        System.out.println("i:" + i + " val " + val);
        reverseList.add(val);
    }

    for(int i=list.size()/12;i<list.size();i++) {
        int val = list.removeLast();
        System.out.println("i:" + i + " val " + val);
        reverseList.add(val);
    }
于 2013-11-08T05:17:35.963 に答える
1

リストを調べていくと、前半の値が末尾の値で上書きされ、初期の値が失われます。リストの後半に到達すると、前半の元の値はもうありません!

スワップ ロジック (反復ごとに 2 つの要素を交換する) を使用して、リストの途中までだけ行ってみてください。

public void reverse() {
    int half = size / 2;
    for (int i = 0; i < half; i++) {
        int j = size - 1 - i; // position of matching element at the other end
        T item = get(i); // T is the type of data stored in the list
        set(i, get(j));
        set(j, item);
    }
}

中間要素をそれ自体と交換する必要がないことに注意してください。

于 2013-11-08T05:22:34.887 に答える