package com.kevin.coding01.basic; /** * Created by YinWenBing on 2017/2/25. */ public class MyLinkedList<E> implements MyList<E> { private Node<E> first;//头节点 private int size = 0;//默认大小为0 public void add(E e) { if (size == 0) { first = new Node<E>(); first.element = e; size++; } else { Node head = first; for (int i = 0; i < size - 1; i++) { head = head.next; } Node add = new Node(); add.element = e; head.next = add; size++; } } public void add(int index, E e) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); } Node prev = getNode(index - 1);//当前索引指向的节点的上一节点 Node next = getNode(index);//当前索引指向的节点成为添加节点的next Node add = new Node(); add.element = e; prev.next = add; add.next = next; size++; } private Node<E> getNode(int index) { Node node = first; for (int i = 0; i < index; i++) { node = first.next; } return node; } public E get(int index) { if (index < 0 || index > size - 1) { throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); } if (size == 0) { return null; } return getNode(index).element; } public E remove(int index) { if (index < 0 || index > size - 1) { throw new IndexOutOfBoundsException("index:" + index + ";size:" + size); } Node prev = getNode(index - 1); Node next = getNode(index + 1); prev.next = next; return getNode(index).element; } public int size() { return size; } public void addFirst(E e) { if (size == 0) { first = new Node<E>(); first.element = e; size++; } else { Node add = new Node(); add.element = e; add.next = first; first = add; size++; } } public void addLast(E e) { Node oldLast = getNode(size - 1); Node add = new Node(); add.element = e; oldLast.next = add; size++; } public E removeFirst() { Node oldFirst = first; if (first.next != null) { first = first.next; size--; return (E) oldFirst.element; } else {//只有一个节点或者一个节点也没有 first = null; return null; } } public E removeLast() { Node last = getNode(size - 1); if (last != null) { E element = (E) last.element; Node newLast = getNode(size - 2); newLast.next = null; size--; return element; } else { //一个节点都不存在 return null; } } /** * 静态内部类 */ private static class Node<E> { E element;//节点数据 Node<E> next;//下一节点 } }