上一篇:教你实现链表判空与取值方法 | 带你学《Java面向对象编程》之九十二
【本节目标】
通过阅读本节内容,你将学会在链表中通过上一节中提到的foot属性实现对指定位置数据进行取值和改值的操作。
根据索引取得数据:public E get(int index)
链表可以像数组一样进行处理,所以也应该可以像数组一样进行索引数据的获取,在这样的情况下就可以继续利用递归的形式来完成。
图一 依据索引获取数据
1、在ILink接口中追加新的方法
public E get(int index) ; //根据索引获取数据
2、在Node类里面追加有根据索引获取数据的处理
public E getNode(int index) {
if (LinkImpl.this.foot ++ == index) { //索引相同
return this.data ; //返回当前数据
}else {
return this.next.getNode(index) ;
}
}
3、在LinkImpl子类里面定义数据获取的实现
public E get(int index) {
if (index >= this.count) { //索引应该在指定的范围之内
return null ;
} //索引数据的获取应该由Node类完成
this.foot = 0 ; //重置索引的下标
return this.root.getNode(index) ;
}
图二 执行结果图
这一特点和数组是很相似的,但是需要注意的是,数组获取一个数据的时间复杂度为1,而链表获取数据的时间复杂度为n。
修改指定索引数据:public void set(int index, E data)
现在已经可以根据索引来获取指定的索引数据了,但是既然可以获取数据,那么也可以进行数据的修改。
1、在ILink接口中追加有新的方法
public void set(int index,E data) ; //修改索引数据
2、在Node类之中应该提供有数据修改的处理支持
public void setNode(int index,E data) {
if (LinkImpl.this.foot ++ == index) { //索引相同
this.data = data ; //修改数据
}else {
this.next.setNode(index,data) ;
}
}
3、在LinkImpl子类里面进行方法的覆写。
public void set(int index,E data) {
if (index >= this.count) { //索引应该在指定的范围之内
return ; //方法结束
} //索引数据的获取应该由Node类完成
this.foot = 0 ; //重置索引的下标
this.root.setNode(index,data) ; //修改数据
}
图三 执行结果二
这种操作的时间复杂度也是n,因为依然需要进行数据的遍历处理。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学