https://blog.csdn.net/qq_19431333/article/details/54572876
参考上面文章
LinkedList 是一个双向链表
New 一个对象的时候
public LinkedList() {
header.next = header.previous = header;
}
头部值是空的,保存前面节点,后面节点的信息,保存的是Entry内部类
private static class Entry {
E element;
Entry next;
Entry previous;
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}·
}
1.Add
调用私有方法addBefore 在链表当前位后面加入元素。
2.addAll 链表中直接添加元素
public boolean addAll(Collection<? extends E> c) {
return addAll(size, c);
}
3.addFirst push
也是调用私有方法addBefore 在链表前位置的前面添加元素
private Entry addBefore(E e, Entry entry) {
Entry newEntry = new Entry(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
这里只关注自己前后的位置,先建一个Entry对象(需要插入的对象),前后节点规定为原来的首位对象,原来首位对象的前面的对象。
然后将previous.next next.previous 修改为新的对象
4.addLast pop
与addFirst类似,将末尾的对象传进去,调用addBefore方法。
5.Contains
调用indexOf方法,遍历链表,找到所选元素的位置。
6.Clone
调用父类方法,
protected native Object clone() throws CloneNotSupportedException;
7.isEmpty
获取链表的大小,判断是不是等于0。
8.Equals
未重写,直接判断链表实体类的值是不是相等的。(string类型把Equals方法重写了)
9.offerFirst,peekFirst(1.6),peek (1.5)。
10.pollFirst,poll 移除第一个元素
11.remove方法移除指定位置的元素 先找到这个元素,然后将这个元素前一个元素的next改为这个元素的next,将这个元素的下一个元素的previous改为这个元素的previous,然后将这个元素的next,previous,element改为null。
测试代码:
import java.util.LinkedList;
public class ReadLinkedList {
public static void main(String[] args) {
LinkedList a = new LinkedList();
LinkedList b = new LinkedList();
a.add(1);
a.add(2);
a.add(3);
a.add(4);
a.add(5);
a.add(6);
a.add(7);
b.addAll(a);
b.addFirst(8);
b.addLast(9);
b.contains(1);
a = (LinkedList) b.clone();
a.add(11);
a.isEmpty();
System.out.println(a.equals(b));
a.get(0);
a.indexOf(1);
a.offerFirst(1);
a.peekFirst();
a.peek();
a.pollFirst();
a.poll();
a.remove(5);
}
}