package com.coding.basic; public class LinkedList implements List { private static class Node { Object data; Node next; } private int size = 0; // 初始化size=0 private Node head = null; @Override public void add(Object o) { Node node = new Node(); node.data = o; node.next = null; if (head == null) { head = node; } else { Node tail = head; while (tail.next != null) { tail = tail.next; } tail.next = node; } size++; } @Override public void add(int index, Object o) { if (size < 1) { index = 0; } else { if (index < 0) { index = 0; } if (index > size - 1) { index = size - 1; } } Node p = null;// 插入位置的前一节点 Node q = head; while (index > 0) { p = q; q = q.next; index--; } Node node = new Node(); node.data = o; node.next = null; if (p == null) { node.next = head; head = node; } else { node.next = p.next; p.next = node; } size++; } @Override public Object get(int index) { if (index < 0 || index > size - 1) { throw new IndexOutOfBoundsException(); } Node p = head; while (index > 0) { p = p.next; index--; } return p.data; } @Override public Object remove(int index) { if (index < 0 || index > size - 1) { throw new IndexOutOfBoundsException(); } Node removeObj; Node p = null; Node q = head; while (index > 0) { p = q; q = q.next; index--; } if (p == null) { removeObj = head; head = head.next; } else { removeObj = p.next; p.next = removeObj.next; } size--; return removeObj.data; } @Override public int size() { return size; } public void addFirst(Object o) { Node node = new Node(); node.data = o; node.next = head; head = node; size++; } public void addLast(Object o) { Node node = new Node(); node.data = o; if (head == null) { head = node; } else { Node p = head; while (p.next != null) { p = p.next; } p.next = node; } size++; } public Object removeFirst() { if (size < 1) { throw new IndexOutOfBoundsException(); } Node removeObj = head; head = head.next; size--; return removeObj.data; } public Object removeLast() { if (size < 1) { throw new IndexOutOfBoundsException(); } Node removeObj; if (head.next == null) { removeObj = head; head = null; } else { Node p = head; while (p.next.next != null) { p = p.next; } removeObj = p.next; p.next = null; } size--; return removeObj.data; } public Iterator iterator() { return new LinkedListIterator(); } private class LinkedListIterator implements Iterator { Node curNode = head; @Override public boolean hasNext() { return curNode != null; } @Override public Object next() { if (!hasNext()) { throw new IndexOutOfBoundsException(); } Object object = curNode.data; curNode = curNode.next; return object; } } }