Android(安卓)LinkedList
16lz
2021-01-26
LinkedList实现
Android的LinkedList是通过双向列表实现的。链表元素除了含有自身的值以为,还含有上一个元素和下一个元素的引用。
private static final class Link { ET data;//当前值 Link previous, next;//上一个,和下个链表对象的引用 Link(ET o, Link p, Link n) { data = o; previous = p; next = n; } }
普通添加方法
真正是由该方法实现,新元素添加在链表的最后,addLast同样是这个方法实现
将上一个元素的head节点指向新元素
private boolean addLastImpl(E object) { Link oldLast = voidLink.previous; //新元素的头指向上一个元素,尾指向链表的头部 Link newLink = new Link(object, oldLast, voidLink); //头元素的头指向新元素 voidLink.previous = newLink; //上一个结尾元素的尾 指向新元素 oldLast.next = newLink; size++; modCount++; return true; }
2.在指定位置插入
1.插入的位置要下于link链表的长度
2.向前后移动元数据,空出当前位置给新元素,上一个元素的next和下一个元素的head分别指向这个元素。
public void add(int location, E object) { if (location >= 0 && location <= size) { Link link = voidLink; if (location < (size / 2)) { for (int i = 0; i <= location; i++) { link = link.next; } } else { for (int i = size; i > location; i--) { link = link.previous; } } Link previous = link.previous; Link newLink = new Link(object, previous, link); previous.next = newLink; link.previous = newLink; size++; modCount++; } else { throw new IndexOutOfBoundsException(); } }
查询
从头开始遍历链表元素的每一个元素。
public boolean contains(Object object) { Link link = voidLink.next; if (object != null) { while (link != voidLink) { if (object.equals(link.data)) { return true; } link = link.next; } } else { while (link != voidLink) { if (link.data == null) { return true; } link = link.next; } } return false; }
删除
同样会遍历元素 找到对应位置上前后的元素,将之前该位置前后的连个元素链接首位链接起来。
@Override public E remove(int location) { if (location >= 0 && location < size) { Link link = voidLink; if (location < (size / 2)) { for (int i = 0; i <= location; i++) { link = link.next; } } else { for (int i = size; i > location; i--) { link = link.previous; } } Link previous = link.previous; Link next = link.next; previous.next = next; next.previous = previous; size--; modCount++; return link.data; } throw new IndexOutOfBoundsException(); }
更多相关文章
- Android(安卓)中文 API (19) ―― TwoLineListItem
- 三种解析xml的方式
- Android(安卓)PreferenceActivity浅析
- SAX解析 android sdk与jdk 有点区别
- android布局文件中一些属性介绍
- Android 读取元素的数据
- Android(安卓)View系列(三):View的绘制流程
- Android开发中的五大布局
- 使用ScrollView时解决android布局不能撑满全屏的问题