课时139:链表(修改指定索引数据)
摘要:现在已经可以通过索引来获取链表中的指定数据,既然可以获取数据,那么也就可以实现修改指定索引位置的数据这种常见功能。
本节将介绍如何实现这个功能。
1. 在 ILink接口中添加 set(int index, E data)
方法
interface ILink<E> {//设置范型避免安全隐患 public void add(E e);//增加数据的个数 public int size();//获取数据的个数 public Object [] toArray(); public boolean isEmpty(); public E get(int index); // 根据索引获取数据 public void set(int index, E data); // 根据索引修改数据
2.在Node类中添加 setNode(int index, E data)
方法(提供数据修改的技术支持)
public void setNode(int index, E data) { if (LinkImpl.this.foot++ == index) { this.data = data; //修改数据 } else { this.next.setNode(index, data); } }
3. 在LinkImpl子类实现方法覆写,实现setNode(int index, E data)
方法
public void set(int index, E data) { if (index >= this.count) { return ; // 索引超出范围,不做任何处理,方法结束 } this.foot = 0; this.root.setNode(index, data);//修改数据 }
4. 测试代码
public class LinkDemo { public static void main(String[] args) { ILink<String> all = new LinkImpl<String>(); System.out.println("【增加之前】数据个数:" + all.size()+"、是否为空集合:"+all.isEmpty()); all.add("Hello"); all.add("World"); all.add("MLDN"); all.add(1,"世界"); System.out.println("【增加之后】数据个数:" + all.size()+"、是否为空集合:"+all.isEmpty()); System.out.println("------数据获取的分割线-------"); System.out.println(all.get(0)); System.out.println(all.get(1)); System.out.println(all.get(4)); // 索引超出范围 } }
运行结果如下:
成功实现数据的修改。
与根据索引获取数据类似,根据索引修改数据的时间复杂度也是 O(n),其中 n 是链表的长度。 这是因为我们需要从头开始遍历链表,直到找到目标索引对应的节点。