类定义
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>,Deque<E>,Cloneabl,java.io.Serializable{}
构造函数
节点内部类
private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
Node<E>(Node<E> prev, E element, Node<E> next){
this.prev = prev;
this.item = element;
this.next = next;
}
}
方法
void linkFirst(E e){
final Node<E> f = first;
final Node<E> newNode = new Node(null, e, f);
first = newNode;
if(f == null){
last = newNode;
}else{
f.prev = newNode;
}
size++;
modCount++;
}
void linkLast(E e){
final Node<E> l = last;
final Node<E> newNode = new Node(l, e, null);
last = newNode;
if(l == null){
first = newNode;
}else{
l.next = newNode;
}
size++;
modCount++;
}
void linkBefore(E e, Node<E> succ){
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node(pred, e, succ);
succ.prev = newNode;
if(pred == null){
first = newNode;
}else{
pred.next = newNode;
}
size++;
modCount++;
}
private E unlinkFirst(Node<E> f){
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f = null;
first = next;
if(next == null){
last = null;
}else{
next.prev = null;
}
size--;
modCount++;
return element;
}
private E unlinkLast(Node<E> l){
final E element = l.item;
final Node<E> prev = l.prev;
l.item = null;
l = null;
last = prev;
if(prev == null){
first = null;
}else{
prev.next = null;
}
size --;
modCount ++;
return element;
}
E unLink(Node<E> x){
final E element = x.item;
final Node<E> prev = x.prev;
final Node<E> next = x.next;
if(prev == null){
first = next;
}else{
prev.next = next;
}
if(next == null){
last = prev;
}else{
next.prev = prev;
}
x.item = null;
size --;
modCount ++;
return element;
}
public E getFirst(){
final Node<E> f = first;
if(f == null)
throw new NoSuchElementException();
return f.item;
}
public E getLast(){
final Node<E> l = last;
if(l == null)
throw new NoSuchElementException();
return l.item;
}
public E removeFirst(){
final Node<E> f = first;
if(f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
public E removeLast(){
final Node<E> l = last;
if(l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}
public void addFirst(E e){
linkFirst(e);
}
public boolean remove(Object o){
if(o == null){
for(Node<E> x = first; x != null; x=x.next){
if(x.item == null){
unlink(x);
return true;
}
}
}else{
for(Node<E> x = first; x != null; x = x.next){
if(o.equals(x.item)){
unlink(x);
return true;
}
}
}
return false;
}
public boolean addAll(Collection<? extends E> c, int index){
checkPositionIndex(index);
Object[] a = c.toArray();
int newLength = c.length;
if(newLength == 0)
return false;
Node<E> pred, succ;
if(index == size){
pred = last;
succ = null;
}else{
succ = node(index);
pred = succ.prev;
}
for(Object o : a){
Node<E> newNode = new Node(pred, o, null);
if(pred == null){
first = newNode;
}else{
pred.next = newNode;
}
pred = newNode;
}
if(succ == null){
last = pred;
}else{
pred.next = succ;
succ.prev = pred;
}
size += newLength;
modCount++;
return true;
}
public void clear(){
for(Node<E> x = first; x != null;){
Node<E> next = x.next;
x.prev = null;
x.item = null;
x.pred = null;
x = next;
}
first = last = null;
size = 0;
modCount ++;
}
Node<E> node(int index){
if(index < (size >> 1)){
Node<E> x = first;
for(int i = 0; i < index; i++){
x = x.next;
}
return x;
}else{
Node<E> x = last;
for(int i = size-1; i > index; i--){
x = x.prev;
}
return x;
}
}
public int indexOf(Object o){
int index = 0;
if(o == null){
for(Node<E> x = first; x != null; x=x.next){
if(x.item == null){
return index;
}
index++;
}
}else{
for(Node<E> x = first; x != null; x = x.next){
if(o.equals(x.item))
return index;
index++;
}
}
return -1;
}
public int lastIndexOf(Object o){
int index = size-1;
if(o == null){
for(Node<E> x = last; x != null; x = x.prev){
if(x.item == null){
return index;
}
index --;
}
}else{
for(Node<E> x = last; x != null; x = x.prev){
if(o.equals(x.item)){
return index;
}
index --;
}
}
return -1;
}
public E peek(){
final Node<E> f = first;
return (f == null) ? null : f.item;
}
迭代器内部类
private class ListItr<E> extends ListIterator<E>{
private Node<E> next;
private Node<E> lastReturned;
private int index;
private int expectedModCount = modCount;
ListItr(int index){
this.next = (index == size) ? null : node(index);
this.index = index;
}
public boolean hasNext(){
return index < size;
}
public E next(){
checkForComdification();
if(!hasNext()){
throw new NoSuchElementException();
}
lastReturned = next;
index ++;
next = next.next;
return lastReturned.item;
}
public boolean hasPrevious(){
return index > 0;
}
public E previous(){
checkForComidification();
if(!hasPrevious){
throw new NoSuchElementException();
}
lastReturned = next = (next == null) ? last : next.prev;
index --;
return lastReturned.item;
}
public int nextIndex(){
return index;
}
public int previousIndex(){
return index - 1;
}
public void remove(){
checkForComdification();
if(lastReturned == null){
throw new IllegalStateException();
}
Node<E> lastNext = lastReturned.next;
unlink(lastReturned);
if(next == lastReturned){
next = lastNext;
}else{
nextIndex--;
}
lastReturned = null;
expectedModCount ++;
}
public void set(E e){
checkComidification();
if(lastReturned == null)
throw new IllegalStateException();
lastReturned.item = e;
}
public void add(E e){
checkForComodification();
lastReturned = null;
if(next == null){
linkLast(e);
}else{
linkBefore(e, next);
}
index ++;
expectedModCount ++;
}
}
private class DescendingIterator<E> extends Iterator<E>{
private final ListItr itr = new ListItr(size());
public boolean haxNext(){
return itr.hasPrevious();
}
public E next(){
return itr.previous();
}
public void remove(){
itr.remove();
}
}