[英]Void Method to Reverse Own Implementation of Java LinkedList
无论如何,我该怎么做? 我需要一种修改实际列表本身的方法。 我尝试这样做:
// 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]
如何避免数字到达中间时重复出现这个问题? 谢谢。
先生,
我设法做到了,您可能会添加自己的逻辑来减少我使用过的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);
}
遍历列表时,您将使用末尾的值覆盖值的前半部分,从而丢失这些早期值。 当您到达列表的后半部分时,上半部分的原始值不再存在!
尝试使用交换逻辑(在每次迭代中交换两个元素),仅遍历列表的一半:
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);
}
}
请注意,您不需要与自身交换中间元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.