11.LinkedList部分源码分析与练习

来源:互联网 发布:移动硬盘mac无法拷贝 编辑:程序博客网 时间:2024/05/17 08:45
import java.io.IOException;import java.util.AbstractSequentialList;import java.util.Collection;import java.util.Deque;import java.util.Iterator;import java.util.List;import java.util.ListIterator;import java.util.NoSuchElementException;class MyLinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable{/** *  */private static final long serialVersionUID = 1L;private static class Node<E>{E data;Node<E> prev;Node<E> next;Node(Node<E> prev, E element, Node<E> next){this.data = element;this.prev = prev;this.next = next;}}transient int size = 0;transient Node<E> first;transient Node<E> last;public MyLinkedList(){}public MyLinkedList(Collection<? extends E> c){this();addAll(c);}//头插法插入newNodeprivate void linkFirst(E e){final Node<E> firstNode = first;final Node<E> newNode = new Node<E>(null, e, firstNode);first = newNode;if (firstNode == null){last = newNode;}else{firstNode.prev = newNode;}size++;}//尾插法插入newNodeprivate void linkLast(E e){final Node<E> lastNode = last;final Node<E> newNode = new Node<E>(lastNode, e, null);last = newNode;if (lastNode == null){first = newNode;}else{lastNode.next = newNode;}size++;}//将e数据节点插入目标节点之前private void linkedBefore(E e, Node<E> targetNode){final Node<E> targetNodePrev = targetNode.prev;final Node<E> newNode = new Node<E>(targetNodePrev, e, targetNode);targetNode.prev = newNode;if (targetNodePrev == null){first = newNode;}else{targetNodePrev.next = newNode;}size++;}//删除链表的第一个非空节点,并返回该节点数据private E unlinkFirst(Node<E> firstNode){//firstNode == first && firstNode != nullfinal E data  = firstNode.data;final Node<E> firstNodeNext = firstNode.next;firstNode.data = null;firstNode.next = null;  //帮助GC尽早释放不用的资源first = firstNodeNext;if (firstNodeNext == null){last = null;}else{firstNodeNext.prev = null;}size--;return data;}//删除链表最后一个非空节点,并返回该节点数据private E unlinkLast(Node<E> lastNode){//lastNode == last && lastNode != nullfinal E data = lastNode.data;final Node<E> lastNodePrev = lastNode.prev;lastNode.data = null;lastNode.prev = null;  //帮助GC尽早释放不用的资源last = lastNodePrev;if (lastNodePrev == null){first = null;}else{lastNodePrev.next = null;}size--;return data;}//将参数node在该链表中删除private E unlink(Node<E> node){final E data = node.data;final Node<E> nodeNext = node.next;final Node<E> nodePrev = node.prev;node.data = null;if (nodePrev == null){first = nodeNext;}else{nodePrev.next = nodeNext;node.prev = null;}if (nodeNext == null){last = nodePrev;}else{nodeNext.prev = nodePrev;node.next = null;}size--;return data;}public boolean contains(Object o){return indexOf(o) != -1;}public int indexOf(Object o){int index = 0;if (o == null){for (Node<E> node = first; node != null; node = node.next){if (node.data == null){return index;}index++;}}else{for (Node<E> node = first; node != null; node = node.next){if (o.equals(node.data)){return index;}index++;}}return -1;}public boolean add(E e){linkLast(e);return true;}public boolean remove(Object o){if (o == null){for (Node<E> node = first; node != null; node = node.next){if (node.data == null){unlink(node);return true;}}}else{for (Node<E> node = first; node != null; node = node.next){if (o.equals(node.data)){unlink(node);return true;}}}return false;}public boolean addAll(Collection<? extends E> c){return addAll(size, c);}public boolean addAll(int index, Collection<? extends E> c){checkPositionIndex(index);  //检验下表是否合法Object[] a = c.toArray();int collength = a.length;if (collength == 0){return false;}Node<E> targetPrevNode, targetNode;  //index位置处的目标节点,以及目标节点的上一个节点if (index == size){targetNode = null;targetPrevNode = last; }else{targetNode = node(index);  //返回index位置的节点targetPrevNode = targetNode.prev;}for (Object o : a){@SuppressWarnings("unchecked")E e = (E)o;Node<E> newNode = new Node<E>(targetPrevNode, e, null);//构造节点并依次从targetPrevNode处开始添加if (targetPrevNode == null){first = newNode;}else{targetPrevNode.next = newNode;targetPrevNode = newNode;}}//将targetNode与targetPrevNode处依次添加后的最后一个节点链接if (targetNode == null){last = targetPrevNode;}else{targetPrevNode.next = targetNode;targetNode.prev = targetPrevNode;}size += collength;return true;}//返回index位置的节点,index>=0 && index < sizeprivate Node<E> node(int index){if (index < (size >> 1)){   //判断下表在前半部分还是后半部分Node<E> node = first;for (int i = 0; i < index; i++){node = node.next;}return node;}else{Node<E> node = last;for (int i = size-1; i > index; i--){node = node.next;}return node;}}private void checkPositionIndex(int index){if (!isPositionIndex(index)){throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}}//检查位置下标,index可以等于size(如向size位置添加节点)private boolean isPositionIndex(int index){return index >= 0 && index <= size;}private String outOfBoundsMsg(int index){return "Index: " + index + ", Size: " + size;}public void clear(){for (Node<E> node = first; node != null;){Node<E> nextNode = node.next;node.data = null;  //引用置空是帮助GC尽早清理不需要的节点node.prev = null;node.next = null;node = nextNode;}first = last = null;size = 0;}public E get(int index){checkElementIndex(index);return node(index).data;}//检查节点下标为链表中已知节点的下标 index >= 0 && index < sizeprivate void checkElementIndex(int index){if (!isElementIndex(index)){throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}}private boolean isElementIndex(int index){return index >= 0 && index < size;}public E set(int index, E element){checkElementIndex(index);Node<E> targetNode = node(index);E oldData = targetNode.data;targetNode.data = element;return oldData;}public void add(int index, E element){checkPositionIndex(index);if (index == size){linkLast(element);}else{linkedBefore(element, node(index));}}public E remove(int index){checkElementIndex(index);return unlink(node(index));}//返回从末尾开始第一次出现含有o的节点的下标public int lastIndexOf(Object o){int index = size;if (o == null){for (Node<E> node = last; node != null; node = node.prev){index--;if (node.data == null){return index;}}}else{for (Node<E> node = last; node != null; node = node.prev){index--;if (o.equals(node.data)){return index;}}}return -1;}@Overridepublic void addFirst(E e) {// TODO Auto-generated method stublinkFirst(e);}@Overridepublic void addLast(E e) {// TODO Auto-generated method stublinkLast(e);}@Overridepublic boolean offerFirst(E e) {// TODO Auto-generated method stubaddFirst(e);return true;}@Overridepublic boolean offerLast(E e) {// TODO Auto-generated method stubaddLast(e);return true;}@Overridepublic E removeFirst() {// TODO Auto-generated method stubfinal Node<E> firstNode = first;if (firstNode == null){throw new NoSuchElementException();}return unlinkFirst(firstNode);}@Overridepublic E removeLast() {// TODO Auto-generated method stubfinal Node<E> lastNode = last;if (lastNode == null){throw new NoSuchElementException();}return unlinkLast(lastNode);}@Overridepublic E pollFirst() {// TODO Auto-generated method stubfinal Node<E> firstNode = first;return firstNode == null ? null : unlinkFirst(firstNode);}@Overridepublic E pollLast() {// TODO Auto-generated method stubfinal Node<E> lastNode = last;return lastNode == null ? null : unlinkLast(lastNode);}@Overridepublic E getFirst() {// TODO Auto-generated method stubfinal Node<E> firstNode = first;if (firstNode == null){throw new NoSuchElementException();}return firstNode.data;}@Overridepublic E getLast() {// TODO Auto-generated method stubfinal Node<E> lastNode = last;if (lastNode == null){throw new NoSuchElementException();}return lastNode.data;}@Overridepublic E peekFirst() {// TODO Auto-generated method stubfinal Node<E> firstNode = first;return firstNode == null ? null : firstNode.data;}@Overridepublic E peekLast() {// TODO Auto-generated method stubfinal Node<E> lastNode = last;return lastNode == null ? null : lastNode.data;}@Overridepublic boolean removeFirstOccurrence(Object o) {// TODO Auto-generated method stubreturn remove(o);}@Overridepublic boolean removeLastOccurrence(Object o) {// TODO Auto-generated method stubif (o == null){for (Node<E> node = last; node != null; node = node.prev){if (node.data == null){unlink(node);  //将找到的该节点从链表中删除return true;}}}else{for (Node<E> node = last; node != null; node = node.prev){if (o.equals(node.data)){unlink(node);return true;}}}return false;}@Overridepublic boolean offer(E e) {// TODO Auto-generated method stubreturn add(e);  //尾插法插入节点}@Overridepublic E remove() {// TODO Auto-generated method stubreturn removeFirst();}@Overridepublic E poll() {// TODO Auto-generated method stubfinal Node<E> firstNode = first;return firstNode == null ? null : unlinkFirst(firstNode); //返回第一个节点数据并删除第一个节点}@Overridepublic E element() {// TODO Auto-generated method stubreturn getFirst();}@Overridepublic E peek() {// TODO Auto-generated method stubfinal Node<E> firstNode = first;return firstNode == null ? null : firstNode.data;}@Overridepublic void push(E e) {// TODO Auto-generated method stubaddFirst(e);}@Overridepublic E pop() {// TODO Auto-generated method stubreturn removeFirst();}@Overridepublic Iterator<E> descendingIterator() {  //descending 递减// TODO Auto-generated method stubreturn new MyDescendingIterator();}private class MyDescendingIterator implements Iterator<E>{final MyListIterator it = new MyListIterator(size());@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn it.hasPrevious();}@Overridepublic E next() {// TODO Auto-generated method stubreturn it.previous();}@Overridepublic void remove(){it.remove();}}@Overridepublic ListIterator<E> listIterator(int index) {// TODO Auto-generated method stubcheckPositionIndex(index);return new MyListIterator(index);}private class MyListIterator implements ListIterator<E>{private Node<E> lastReturned;private Node<E> next;private int nextIndex;public MyListIterator(int index) {// TODO Auto-generated constructor stubnext = (index == size) ? null : node(index);nextIndex = index;}@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn nextIndex < size;}@Overridepublic E next() {//非线程安全,并且没有检查是否一致的情况(比如在遍历的同时有其他线程在添加元素)// TODO Auto-generated method stubif (!hasNext()){throw new NoSuchElementException();}lastReturned = next; //在next()方法中next指向当前节点lastReturned指向上一个节点next = next.next;nextIndex++;return lastReturned.data;}@Overridepublic boolean hasPrevious() {// TODO Auto-generated method stubreturn nextIndex > 0;}@Overridepublic E previous() {// TODO Auto-generated method stubif (!hasPrevious()){throw new NoSuchElementException();}//lastReturned和next都指向当前节点lastReturned = next = (next == null) ? last : next.prev;nextIndex--;return lastReturned.data;}@Overridepublic int nextIndex() {// TODO Auto-generated method stubreturn nextIndex;}@Overridepublic int previousIndex() {// TODO Auto-generated method stubreturn nextIndex - 1;}@Overridepublic void remove() {// TODO Auto-generated method stubif (lastReturned == null){throw new IllegalStateException();}Node<E> lastNext = lastReturned.next;unlink(lastReturned);if (next == lastReturned){ //previous()出现的情况//而对于previous()出现的情况,删除该节点的时候next和lastReturned都指向要删除的节点//因此next需要向后移动next = lastNext;}else{   //next()出现的情况//而对于next()出现的情况,删除该节点之前,next已经指向该节点的下一个节点nextIndex--;}lastReturned = null;}@Overridepublic void set(E e) {// TODO Auto-generated method stubif (lastReturned == null){throw new IllegalStateException();}lastReturned.data = e;}@Overridepublic void add(E e) {// TODO Auto-generated method stubif (next == null){linkLast(e);}else{linkedBefore(e, next);}lastReturned = null;nextIndex++;}}@SuppressWarnings("unchecked")private MyLinkedList<E> superClone(){try {return (MyLinkedList<E>)super.clone();} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blockthrow new InternalError(e);}}public Object clone(){MyLinkedList<E> clone = superClone();clone.first = clone.last = null;clone.size = 0;for (Node<E> node = first; node != null; node = node.next){clone.add(node.data);}return clone;}public Object[] toArray(){Object[] array = new Object[size];int i = 0;for (Node<E> node = first; node != null; node = node.next){array[i++] = node.data;}return array;}@SuppressWarnings("unchecked")public <T> T[] toArray(T[] a){if (a.length < size){//利用反射构造a在运行时期具体类型的size大小数组a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);}int i = 0;Object[] result = a;for (Node<E> node = first; node != null; node = node.next){result[i++] = node.data;}if (a.length > size){a[size] = null;}return a;}//虽然是private方法,但是可以通过反射访问重写后的writeObject(),readObject()方法private void writeObject(java.io.ObjectOutputStream s) throws IOException{s.defaultWriteObject();  //写入隐藏的序列化数据s.writeInt(size);  //写入链表节点个数for (Node<E> node = first; node != null; node = node.next){s.writeObject(node);  //遍历每隔节点,写入每个节点的数据}}@SuppressWarnings("unchecked")private void readObject(java.io.ObjectInputStream s) throws ClassNotFoundException, IOException{s.defaultReadObject();   //读取隐藏的序列化数据int size = s.readInt();   //读取链表节点个数for (int i = 0; i < size; ++i){  linkLast((E)s.readObject());  //依次读取每个节点的数据,构造整个链表}}@Overridepublic int size() {// TODO Auto-generated method stubreturn size;}}

0 0