java源码分析之LinkedList(三)

2014-11-24 11:27:30 · 作者: · 浏览: 28
1来判断链表中是否包含对象o。
element()
1 public E element() {
2 return getFirst();
3 }
getFirst()
1 public E getFirst() {
2 if (size==0)
3 throw new NoSuchElementException();
4 return header.next.element;
5 }
element()方法调用了getFirst()返回链表的第一个节点的元素。为什么要提供功能一样的两个方法,像是包装了一下名字?其实这只是为了在不同的上下文“语境”中能通过更贴切的方法名调用罢了。
get(int index)
1 public E get(int index) {
2 return entry(index).element;
3 }
get(int index)方法用于获得指定索引位置的节点的元素。它通过entry(int index)方法获取节点。entry(int index)方法遍历链表并获取节点,在上面有说明过,不再陈述。
set(int index,E element)
1 public E set(int index, E element) {
2 Entry e = entry(index);
3 E oldVal = e.element;
4 e.element = element;
5 return oldVal;
6 }
先获取指定索引的节点,之后保留原来的元素,然后用element进行替换,之后返回原来的元素。
getLast()
1 public E getLast() {
2 if (size==0)
3 throw new NoSuchElementException();
4 return header.previous.element;
5 }
getLast()方法和getFirst()方法类似,只是获取的是header节点的前一个节点的元素。因为是循环链表,所以header节点的前一节点就是链表的最后一个节点。
lastIndexOf(Object o)
1 public int lastIndexOf(Object o) {
2 int index = size;
3 if (o==null) {
4 for (Entry e = header.previous; e != header; e = e.previous) {
5 index--;
6 if (e.element==null)
7 return index;
8 }
9 } else {
10 for (Entry e = header.previous; e != header; e = e.previous) {
11 index--;
12 if (o.equals(e.element))
13 return index;
14 }
15 }
16 return -1;
17 }
因为查找的是last index,即最后一次出现的位置,所以采用由后向前的遍历方式。因为采用了有后向前的遍历,所以index被赋值为size,并且循环体内执行时都进行减操作。分两种情况判断是否存在,分别是null和不为空。
offer(E e)
1 public boolean offer(E e) {
2 return add(e);
3 }
在链表尾部插入元素。
offerFirst(E e)
1 public boolean offerFirst(E e) {
2 addFirst(e);
3 return true;
4 }
在链表开头插入元素。
offerLast(E e)
1 public boolean offerLast(E e) {
2 addLast(e);
3 return true;
4 }
在链表末尾插入元素。
上面这三个方法都只是调用了相应的add方法,同样只是提供了不同的方法名在不同的语境下使用。
peek()
1 public E peek() {
2 if (size==0)
3 return null;
4 return getFirst();
5 }
peekFirst()
1 public E peekFirst() {
2 if (size==0)
3 return null;
4 return getFirst();
5 }
peekLast()
1 public E peekLast() {
2 if (size==0)
3 return null;
4 return getLast();
5 }
上面的三个方法也很简单,只是调用了对应的get方法。
poll()
1 public E poll() {
2 if (size==0)
3 return null;
4 return removeFirst();
5 }
pollFirst()
1 public E pollFirst() {
2 if (size==0)
3 return null;
4 return removeFirst();
5 }
pollLast()
1 public E pollLast() {
2 if (size==0)
3 return null;
4 return removeLast();
5 }
poll相关的方法都是获取并移除某个元素。都是和remove操作相关。
pop()
1 public E pop() {
2 return removeFirst();
3 }
push(E e)
1 public void push(E e) {
2 addFirst(e);
3 }
这两个方法对应栈的操作,即弹出一个元素和压入一个元素,仅仅是调用了removeFirst()和addFirst()方法。
下面集中看remove相关操作的方法。
remove()
1 public E remove() {
2 return removeFirst();
3 }
remove(int index)
1 public E remove(int index) {
2 return remove(entry(index));
3 }
remov