packagecom.wenr.collection;importjava.util.Iterator;importjava.util.NoSuchElementException;/***@authorwenr
*
* 实现方法:
* - void add(E e)
* - void add(int index, E e)
* - E get(int index)
* - int indexOf(Object o)
* - boolean contains(Object o)
* - E remove(int index)
* - boolean remove(Object o)
* - boolean isEmpty()
* - int size()
* - Iterator iterator()
**/
public class LinkedListDemo{private intsize;
Nodefirst;
Nodelast;publicLinkedListDemo() {
}//添加一个节点在结尾处
public voidadd(E e) {
Node l =last;
Node node = new Node(e, last, null);
last=node;if (l == null) {
first=node;
}else{
l.next=node;
}
size++;
}public void add(intindex, E e) {
rangeCheckForAdd(index);if (index ==size) {
add(e);
}else{
Node x =node(index);
addBeforeNode(e, x);
}
}private void rangeCheckForAdd(intindex) {if (index < 0 || index >size)throw new IndexOutOfBoundsException("下标越界:" +index);
}private void addBeforeNode(E e, NodebeforeNode) {
Node preNode =beforeNode.prev;
Node newNode = newNode(e, preNode, beforeNode);if (preNode == null) {
first=newNode;
}else{
preNode.next=newNode;
}
beforeNode.prev=newNode;
size++;
}private Node node(intindex) {//如果node在前一半就正向查找 否则逆向查找
if (index < (size >> 1)) {
Node cursor =first;for (int i = 0; i < index; ++i) {
cursor=cursor.next;
}returncursor;
}else{
Node cursor =last;for (int i = size-1; i > index; --i) {
cursor=cursor.prev;
}returncursor;
}
}public E get(intindex) {
rangeCheck(index);
Node x =node(index);returnx.item;
}private void rangeCheck(intindex) {if (index < 0 || index >=size)throw new IndexOutOfBoundsException("数组越界:" +index);
}public intindexOf(Object o) {int index = 0;if (o == null) {for (Node x = first; x != null; x =x.next) {if (x.item == null)returnindex;
index++;
}
}else{for (Node x = first; x != null; x =x.next) {if(o.equals(x.item))returnindex;
index++;
}
}return -1;
}public E remove(intindex) {
rangeCheck(index);
Node x =node(index);final E element =x.item;final Node prev =x.prev;final Node next =x.next;if (prev == null) {
first=next;
}else{
prev.next=next;
x.prev= null;
}if (next == null) {
last=prev;
}else{
next.prev=prev;
x.next= null;
}
x.item= null;
size--;returnelement;
}public booleanremove(Object o) {int index =indexOf(o);if (index < 0)return false;
remove(index);return true;
}public intsize() {returnsize;
}public booleanisEmpty() {return size == 0;
}public booleancontains(Object o) {return indexOf(o) >= 0;
}public Iteratoriterator() {return newItr();
}private static class Node{
E item;
Nodeprev;
Nodenext;public Node(E item, Node prev, Nodenext) {this.item =item;this.prev =prev;this.next =next;
}
}private class Itr implements Iterator{private Nodecursor;private intnextIndex;publicItr() {
cursor=first;
nextIndex= 0;
}
@Overridepublic booleanhasNext() {return nextIndex
}
@OverridepublicE next() {if (!hasNext())throw newNoSuchElementException();
E element=cursor.item;
cursor=cursor.next;
nextIndex++;returnelement;
}
}public static voidmain(String[] args) {
LinkedListDemo list = new LinkedListDemo<>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
list.add("dddd");
System.out.println(list.size());
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(0));
System.out.println(list.remove(2));
list.add(3, "eeee");
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));
System.out.println("_____");
Iterator itr =list.iterator();while(itr.hasNext()) {
System.out.println(itr.next());
}
}
}