package com.xusheng.linkedlist; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; public class MyLinkedList<T> implements Iterable<T> { private int size; private int modCount=0; private Node<T> beginMarker; private Node<T> endMarker; public MyLinkedList() { doClear(); } public void clear(){ doClear(); } public void doClear(){ beginMarker = new Node<T>(null,null,null); endMarker = new Node<T>(null,beginMarker,null); beginMarker.next = endMarker; this.size = 0; this.modCount++; } public int size(){ return this.size; } public boolean isEmpty(){ return size==0; } public void add(int index,T element){ addBefore(getNode(index),element); } public boolean add(T element){ add(size,element); return true; } public T get(int index){ return getNode(index).data; } public T set(int index,T element){ Node<T> node = getNode(index); T oldElement = node.data; node.data = element; return oldElement; } public T remove(int index){ return remove(getNode(index)); } //此方法用于判断集合中是否含有输入的元素 public boolean contains(T element){ for(int i=0;i<size;i++){ if(element.equals(getNode(i).data)){ return true; } } return false; } //该方法用于index对应的元素与后一个元素进行位置调换 public void change(int index){ Node<T> node = getNode(index); Node<T> beforep,afterp; beforep = node.prev; afterp = node.next; beforep.next = afterp; afterp.prev = beforep; node.next = afterp.next; node.prev = afterp; afterp.next = node; afterp.prev = beforep; } private T remove(Node<T> delNode){ delNode.next.prev = delNode.prev; delNode.prev.next = delNode.next; size--; modCount++; return delNode.data; } private void addBefore(Node<T> p,T element){ Node<T> newNode = new Node<T>(element,p.prev,p); newNode.prev.next = newNode; p.prev = newNode; this.size++; this.modCount++; } private Node<T> getNode(int index){ Node<T> p; if(index>=0 && index<=size){ if(index<(size/2)){ p = beginMarker.next; for(int i=0;i<index;i++){ p = p.next; } }else{ p = endMarker; for(int i=size;i>index;i--){ p = p.prev; } } }else{ throw new IndexOutOfBoundsException(); } return p; } @Override public Iterator<T> iterator() { return new LinkedListIterator(); } private class Node<T>{ public T data; public Node<T> prev; public Node<T> next; public Node(T data, Node<T> prev, Node<T> next) { this.data = data; this.prev = prev; this.next = next; } } private class LinkedListIterator implements Iterator<T>{ private Node<T> current = beginMarker.next; private int expectedModCount = modCount; private boolean okToRemove = false; @Override public boolean hasNext() { return current != endMarker; } @Override public T next(){ if(modCount != expectedModCount){ throw new ConcurrentModificationException(); } if(!hasNext()){ throw new NoSuchElementException(); } T n = current.data; current = current.next; okToRemove = true; return n; } public void remove(){ if(modCount != expectedModCount){ throw new ConcurrentModificationException(); } if(!okToRemove){ throw new IllegalStateException(); } MyLinkedList.this.remove(current.prev); size--; expectedModCount++; okToRemove = false; } } }