package com.github.FelixCJF.coding2017.basic; import java.util.NoSuchElementException; public class LinkedList implements List { private Node head;//头指针 private Node last;//尾指针 private int size = 0; public void add(Object o){ addLast(o); } public void add(int index , Object o){ //检查是否越界 checkIndex(index); Node indexNode = node(index); if (index == size) { addLast(o); } else { final Node pred = indexNode.prv; final Node newNode = new Node(); newNode.data = o; newNode.next = indexNode; newNode.prv = pred; indexNode.prv = newNode; if (pred == null) { head = newNode; } else { pred.next = newNode; } } size ++; } public Object get(int index){ //检查是否越界 checkIndex(index); Node indexNode = node(index); return indexNode.data; } public Object remove(int index){ //检查是否越界 checkIndex(index); Node indexNode = node(index); Object element = indexNode.data; Node pre = indexNode.prv; Node next = indexNode.next; if (pre == null) { head = next; } else { pre.next = next; indexNode.prv = null; } if (next == null) { last = pre; } else { next.prv = pre; indexNode.next = null; } indexNode.data = null; size --; return element; } public int size(){ return size; } public void addFirst(Object o){ //节点变量存放原来的头指针 final Node oldHead = head; //创建新的节点对象 final Node newNode = new Node(); newNode.data = o; newNode.next = head; newNode.prv = null; //判断oldhead是否为null if (oldHead == null) { last = newNode; }else { //头指针指向新创建的节点对象 oldHead.prv = newNode; } //将newNode变为头指针 head = newNode; size ++; } public void addLast(Object o){ //节点新变量放原先的尾指针 final Node oldLast = last; //创建新节点,加入要添加的对象 final Node newNode = new Node(); newNode.data = o; newNode.next = null; newNode.prv = oldLast; if (oldLast == null) { head = newNode; } else { //尾指针指向新创建的节点 oldLast.next = newNode; } //newNode变为尾指针 last = newNode; size++; } public Object removeFirst(){ //通过头指针创建头节点 final Node hNode = head; if (hNode == null) { throw new NoSuchElementException(); } final Node next = hNode.next; final Object element = hNode.data; //移除 hNode.data = null; hNode.next = null; head = next; //判断是否为尾节点 if (next == null) { last = null; }else { next.prv = null; } size --; return element; } public Object removeLast(){ //通过尾指针创建节点 final Node lastNode = last; if (lastNode == null) { throw new NoSuchElementException(); } final Object element = lastNode.data; final Node prve = lastNode.prv; //移除 lastNode.data = null; lastNode.prv = null; last = prve; if (prve == null) { head = null; } else { prve.next = null; } size --; return element; } public Iterator iterator(){ return new LinkedListIterator(); } private class LinkedListIterator implements Iterator{ private Node currentNode = head;//当前节点 public boolean hasNext() { if (currentNode == null) { return false; } return true; } public Object next() { Object element = currentNode.data; currentNode = currentNode.next; return element; } } //查找index节点,并返回该节点 Node node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node x = head; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node x = last; for (int i = size - 1; i > index; i--) x = x.prv; return x; } } //检查索引 private void checkIndex(int index){ if (index < 0 || index > size) { throw new IndexOutOfBoundsException(); } } private static class Node{ Object data; Node next; Node prv; } }