package com.coding.basic; import java.util.NoSuchElementException; /** * Created by huitailang on 17/2/25. * * @author zhangkun * @date 2017年02月25日13:57:58 */ public class LinkedList implements List { private Node head; private int size; public LinkedList() { head = null; size = 0; } @Override public void add(Object o) { if (head == null) { Node newNode = new Node(); newNode.data = o; head = newNode; } Node oldhead = head; head = new Node(); head.data = o; head.next = oldhead; size++; } @Override public void add(int index, Object o) { Node newNode = new Node(); newNode.data = o; if (head == null) { head = newNode; } if (index < 1 || index > size + 1) { throw new IllegalArgumentException("invalid index, it's should be 1 and" + size + 1); } if (index == 1) { newNode.next = head; } else { Node currentNode = head; int count = 1; while (count < index - 1) { count++; currentNode = currentNode.next; } newNode.next = currentNode.next; currentNode.next = newNode; } } @Override public Object get(int index) { if (head == null) { return null; } if (index == 1) { return head.next.data; } else { Node currentNode = head; int count = 1; while (count < index - 1) { count++; currentNode = currentNode.next; } return currentNode.next.data; } } @Override public Object remove(int index) { Object result = null; if (index < 1 || index > size) { throw new IllegalArgumentException("invalid index, it's should be 1 and " + size); } if (index == 1) { Node currentNode = head.next; head = null; return currentNode; } else { Node prevNode = head; int count = 1; while (count < index - 1) { prevNode = prevNode.next; count++; } Node currentNode = prevNode.next; prevNode.next = currentNode.next; result = currentNode.data; currentNode = null; } return result; } @Override public int size() { return size; } public void addFirst(Object o) { add(1, o); } public void addLast(Object o) { add(size + 1, o); } public Object removeFirst() { return remove(1); } public Object removeLast() { return remove(size); } public Iterator iterator() { return new ListIterator(); } public void print() { if (head == null) { System.out.println("No elements in the list!"); } Node currentNode = head; while (currentNode != null) { System.out.println(currentNode.data + "->"); currentNode = currentNode.next; } System.out.println(); } public int length() { int count = 0; Node currentNode = head; while (currentNode != null) { count++; currentNode = currentNode.next; } return count; } private static class Node { Object data; Node next; } private class ListIterator implements Iterator { private Node current = head; @Override public boolean hasNext() { return current != null; } public void remove() { throw new UnsupportedOperationException(); } @Override public Object next() { if (!hasNext()) { throw new NoSuchElementException(); } Object o = current.data; current = current.next; return o; } } }