三、代码实现:(基本原理在代码注释中!)
(1)原理引入:用到了LinkedList类的常用简单方法,因为List接口的实现类——LinkedList,它的内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式记录他前一个元素和后一个元素。我就不需要去创建一个链表来实现这个题,方便很多。然后因为是双链表,所以它的增删效率很高。
(2)我创建了Linked_List类。因为要用到LinkedList类去操作,所以要记得导包。
package com.fs.link;
/*
* LinkedList 内部维护了一个双向循环链表
* 这里面的链表中的每一个元素都使用引用的方式记录它的前一个元素和后一个元素,其增删效率非常高
*/
import java.util.LinkedList;
import java.util.Scanner;
public class Linked_List {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
LinkedList<Integer> list01= new LinkedList<>(); //指定这个集合里面的存储的元素:是Integer类型的对象
int n= sc.nextInt();
for(int i=0;i<n;i++){
list01.add(sc.nextInt()); //因为 LinkedList实现了List接口,List接口继承了父接口Collection,里面就有add(Object o)(其中o泛指对象)方法向按顺序集合中添加元素
}
int index01=sc.nextInt()-1; //输入的是指定删除的位置,所以实际删的位置的索引要减1
//保证要删除的位置在集合中有元素,否则不做操作
if(index01>=0){
if(index01<list01.size()){ //这里原理也是一样,size()方法返回的集合中元素个数比索引要大1,所以不能等于,否则就是没有这个元素在集合里面
list01.remove(index01);//因为 LinkedList实现了List接口,List接口继承了父接口Collection,里面就有remove(Object o)(其中o泛指对象)方法删除集合中指定元素
}
}
int index02=sc.nextInt()-1;
int value=sc.nextInt();
//注意如果删除成功了一个元素,那么它的调用size()方法时返回的元素个数会少一个,但其实那个索引的位置其实是可以用的,所以添加的时候要注意下标可以等于返回的元素个数
if (index02 >= 0) {
if (index02 <= list01.size()) {
list01.add(index02,value); //满足条件就插入元素 add(int index,Object element)这个方法是LinkedList类自带的新增方法,在当前集合的索引位置插入元素element
}
}
for(Integer value01 :list01){ //迭代器输出集合中的元素
System.out.print(value01+" ");
}
}
}
四、不同情况的代码运行结果:
<1> 首先测试输入题目中输入样例:
<2> 然后当我们删除条件不满足,插入条件满足时:
<3> 然后当我们删除条件不满足,插入条件满足时(其他情况):