/** * */ package com.coding.basic.container; /** * @author Administrator * */ public class LinkedList implements List { private int size; private Node head; public LinkedList() { head = new Node(null, null, null); size = 0; } @Override public boolean add(Object o) { Node nodeAdd; Node nodeCurrent = head; while (nodeCurrent.next != null) { nodeCurrent = nodeCurrent.next; } nodeAdd = new Node(o, nodeCurrent, null); nodeCurrent.next = nodeAdd; size++; return true; } @Override public boolean remove(Object o) { if (head.next == null) { return false; } Node nodeCurrent = head; while (nodeCurrent.next != null) { nodeCurrent = nodeCurrent.next; if (nodeCurrent.data.equals(o)) { nodeCurrent.previous.next = nodeCurrent.next; nodeCurrent.next.previous = nodeCurrent.previous; size--; return true; } } return false; } @Override public Object get(int index) { checkIndex(index); int i = 0; Node nodeCurrent = head; do { nodeCurrent = nodeCurrent.next; } while (i < index); return nodeCurrent.data; } @Override public Object set(int index, Object element) { checkIndex(index); int i = 0; Node nodeCurrent = head; do { nodeCurrent = nodeCurrent.next; } while (i < index); Object o = nodeCurrent.data; nodeCurrent.data = element; return o; } @Override public void add(int index, Object element) { checkIndex(index); int i = 0; Node nodeCurrent = head; do { nodeCurrent = nodeCurrent.next; } while (i < index); Node nodeNew = new Node(element, nodeCurrent.previous, nodeCurrent); nodeCurrent.previous = nodeNew; size++; } @Override public Object remove(int index) { checkIndex(index); Node nodeCurrent = head; int i = 0; do { nodeCurrent = nodeCurrent.next; } while (i < index); Object o = nodeCurrent.data; if (index == size - 1) { nodeCurrent.previous.next = null; } else { nodeCurrent.previous.next = nodeCurrent.next; nodeCurrent.next.previous = nodeCurrent.previous; } size--; return o; } private void checkIndex(int index) { if (index >= size) { throw new IndexOutOfBoundsException(); } } @Override public int size() { return size; } @Override public boolean isEmpty() { return 0 == size; } private static class Node { public Node(Object data, Node pre, Node next) { this.data = data; this.previous = pre; this.next = next; } Object data; Node previous; Node next; } public void addFirst(Object o) { add(0, o); } public void addLast(Object o) { add(o); } public Object removeFirst() { Object o = remove(0); return o; } public Object removeLast() { Object o = remove(size); return o; } @Override public Iterator iterator() { return new IteratorlinkedList(); } private class IteratorlinkedList implements Iterator { private int cursor; @Override public boolean hasNext() { return cursor < size - 1; } @Override public Object next() { if (hasNext()) { int i = 0; Node nodeCurrent = head; do { nodeCurrent = nodeCurrent.next; } while (i < cursor + 1); cursor++; return nodeCurrent.data; } else { return null; } } } }