package com.coding.mybasic; public class LinkedList implements List { private Node head; private Node last; private int size; public LinkedList() { } @Override public void add(Object element) { if(head == null){ addHead(element); }else{ addLast(element); } } @Override public void add(int index, Object element) { if(index == size){ add(element); return; } if(index == 0){ addFirst(element); return; } checkIndex(index); insertElement(index - 1,element); } @Override public Object get(int index) { checkIndex(index); Node node = getNodeByIndex(index); return node != null ? node.data : null; } @Override public Object remove(int index) { checkIndex(index); Object element = null; if(index == 0){ element = removeFirst(); } else if(index == (size - 1)){ element = removeLast(); } else { element = removeMiddle(index); } return element; } @Override public int size() { return size; } @Override public Iterator iterator() { return new LinkedListIterator(); } private class LinkedListIterator implements Iterator{ private Node node = head; int i = 0; @Override public boolean hasNext() { return i < size; } @Override public Object next() { checkIndex(i); Object element = node.data; node = node.next; i++; return element; } } public void addFirst(Object o){ Node node = new Node(); node.data = o; node.next = head.next; head = node; size++; } public void addLast(Object o){ Node node = new Node(); node.data = o; node.next = null; last.next = node; last = node; size++; } public Object removeFirst(){ return removeFirstNode(); } public Object removeLast(){ return removeLastNode(); } private Object removeMiddle(int index) { Node temp = getNodeByIndex(index - 1); Node removeNode = temp.next; Object element = removeNode.data; temp.next = removeNode.next; removeNode = null; size--; return element; } /** * 检查index index >=0 且 < size * @param index * @throws Exception */ private void checkIndex(int index) { if(index < 0){ throw new RuntimeException("index 必须大于0"); } // 越界 if(index >= size){ throw new RuntimeException("index 必须小于size:" + size); } } /** * 添加head * @param element */ private void addHead(Object element) { head = new Node(); head.data = element; head.next = null; last = head; size++; } /** * 插入序号在0-size之间的元素,不包含0和size位置 * @param index * @param element */ private void insertElement(int index, Object element) { Node temp = getNodeByIndex(index); if(temp != null){ Node node = new Node(); node.data = element; node.next = temp.next; temp.next = node; } size++; } /** * 获取下标为index的元素 * @param index * @return */ private Node getNodeByIndex(int index) { Node temp = head; int i = 0; while(i < size){ if(i == index){ return temp; } temp = temp.next; i++; } return null; } /** * 移除最后一个元素 * @return */ private Object removeLastNode() { Node node = getNodeByIndex(size - 2); Node lastNode = node.next; Object element = lastNode.data; lastNode = null; last = node; size--; return element; } /** * 移除第一个元素 * @return */ private Object removeFirstNode() { Node node = head.next; Object element = head.data; head = null; head = node; size--; return element; } private static class Node{ Object data; Node next; public Node() { } @SuppressWarnings("unused") public Node(Object data, Node next) { super(); this.data = data; this.next = next; } } }