基本思路:用listIterator(n)指向列表索引为n元素的特性,将ListIterator指向list1的末尾,依次加入到list2中。即反向读取list1,将读取的每一个元素顺序插入list2.
package p409;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class TwoList {
int length;
List<Integer> list1 = new ArrayList<Integer>(length);
List<Integer>list2 = new ArrayList<Integer>(length);
ListIterator<Integer> li;
//构造函数,给list1赋值,并且将li指向list1的最末尾的一个元素。
TwoList(int length){
this.length=length;
for(int i=1;i<length;i++){
list1.add(i);
}
li= list1.listIterator(length-1);//List序号是从零开始计数的,所以最末尾的元素为length-1
}
//对list2 进行初始化
void list2(){
while(li.hasPrevious()){//当ListIterator li 前面具有元素时,将当前的元素赋值给list2,并且向前移动(即li.previous的功能)
list2.add(li.previous());
}
}
//分别输出list1,list2
void out1(){
System.out.println(list1);
}
void out2(){
System.out.println(list2);
}
static class Test{
public static void main(String[] args) {
TwoList tw=new TwoList(10);
tw.list2();
tw.out1();
tw.out2();
}
}
}
网上查询到其他解决办法,其中通过
while(li.hasnext()){
li1.next();
}将li指向list1的末尾,并且对于list2列表的操作也使用了ListIterator(对于后者,我觉得没有必要,此题中对list2本身就应该是一个空的list,对于它的操作仅仅是通过add()方法就可以了,没必要再创建一个listIterator)。
感想:
最初想通过直接对list进行操作,发现并不可行,list列表只有add(),get()等方法,事实上是很难做到对其进行类似指针移动的操作,所以日后对于每一个需要操作的list数组进行一些操作,可能都需要用到ListIterator,或者简单的Iterator。在这里也不难理解为什么在这道题中的其它解决方法里,有人会对list2也使用一个listIterator,毕竟对list2也要进行一些操作(尽管这里只需要添加元素就好了)。在编写代码的时候,我总是会想直接把ListIterator直接赋值给List列表,类似于list1=li。事实上,这样是行不通的,List列表和迭代器ListIterator之间的关系不存在继承,仅仅是迭代器ListIterator 对Collection进行操作而已。实现赋值则是使用List的add()方法,调用迭代器Iterator的next()方法,传入list。(本题中使用的是list2.add(li.previous());)
此外,listIterator比iterator更为强大,它可以实现双向移动,也可以直接指向某个具体的元素,而iterator则只能单向移动。
最后:思考良久,决定还是不将我的博客设置为私密好了,有人能看必定是好事,发现其中错误更是可喜可贺,本人也是大三学生一枚,想记录一些自己学习过程中的问题,解决方法等,同时也想着,或许能被大神看到?对我一些遗漏之类的进行补充?那自然也能学习到不少