0
public static ArrayList<Integer> reverse (ArrayList<Integer> n) {
    ArrayList<Integer> result = new ArrayList<Integer>();

    for(int i = 0; i < n.size(); i++) {
        int j = n.size() - i - 1; 
        result.add(i, n.get(j));
    }

    return result;
}

しかし、配列を入力すると1,2,3,4,5,6,7,8,9,10 、結果は10,9,8,7,6,5,4,3,2,10

私の間違いはどこですか?

4

4 に答える 4

4

実際、そこにあるものはうまく機能します。forただし、 「逆方向」に反復することでループを単純化できます。

for(int i = n.size() - 1 ; i >= 0 ; i--)
    result.add(n.get(i));

あ、それと、もう一つ言っておきたいことがあります。list を宣言するときresult、それがどうなるかはわかっているので、その容量を指定したくなるかもしれません。すなわち:

ArrayList<Integer> result = new ArrayList<Integer>(n.size());
于 2012-11-03T00:31:14.257 に答える
3

n.size() / 2スワップを (可能な限り少なく)使用し、線形時間で実行します。

public static ArrayList<Integer> reverse (ArrayList<Integer> n)
{
    for (int i = 0, j = n.size() - 1, t; i <= size / 2; ++i, --j)
    {
        t = n.get(i);
        n.set(i, n.get(j));
        n.set(j, t);
    }
    return n;
}
于 2012-11-03T00:42:02.977 に答える
0

項目数が偶数のリストでは機能しません

于 2015-12-15T07:51:55.187 に答える
0

Collections.reverse(arrayList);

それでもマニュアルを使いたい場合は、

     public ArrayList<Integer> reverse(ArrayList<Integer> arrayList) {
        ArrayList<Integer> result = (ArrayList<Integer>)list.clone();
        for (int start=0,end=result.size()-1;start<end;start++,end--) {
           swap(result,start,end) ;
        }
        return result;
     }
     public void swap(ArrayList<Integer> temp, int front, int back) {
        Integer i = temp.set(front,temp.get(back)) ;
        temp.set(back, i) ;
     }
于 2012-11-03T00:26:17.140 に答える