一、前言:
这是怀化学院的:Java数据结构中的一道难度中等偏下的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。
二、题目要求如下:
(第 8 题) 链式线性表的插入与删除(难度系数65)
链式线性表的插入与删除
描述:删除链式线性表指定位置的元素。
输入:第一行为自然数n,表示链式线性表的长度,第二行为n个自然数表示链式线性表各元素值。第三行为指定删除的位置,第四行为插入的位置及元素值(如果位置不对,则不作操作,插入位置应在删除元素后重新计数)。
输出:输出删除与插入元素后的链式线性表的所有元素,元素之间用一个空格隔开。
样例输入:
5
1 2 3 4 5
3
6 7
样例输出:
1 2 4 5
三、代码实现:(基本原理在代码注释中!)
(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> 然后当我们删除条件不满足,插入条件满足时(其他情况):