package com.byhieg.coding2017;
import javax.swing.text.html.HTMLDocument;
public class LinkedList implements List {
private Node head;
int size = 0;
public void add(Object o) {
addLast(o);
}
public void add(int index, Object o) {
checkRangeForAdd(index);
if (index == size) {
addLast(o);
}
Node nextNode = node(index);
Node newNode = new Node(o, nextNode);
Node prevNode;
if (index == 0) {
prevNode = null;
} else {
prevNode = node(index);
}
if (prevNode == null) {
head = newNode;
}else{
prevNode.next = newNode;
}
size++;
}
private Node node(int index) {
Node cursor = head;
for (int i = 0; i < index; i++) {
cursor = cursor.next;
}
return cursor;
}
private void checkRangeForAdd(int index) {
if (index > size || index < 0) {
throw new IndexOutOfBoundsException("指定的index超过界限");
}
}
public Object get(int index) {
checkRange(index);
return node(index).data;
}
private void checkRange(int index) {
if (index >= size || index < 0) {
throw new IndexOutOfBoundsException("指定index超过界限");
}
}
public Object remove(int index) {
checkRange(index);
Node targetNode = node(index);
Object o = targetNode.data;
Node prevNode ;
Node nextNode = targetNode.next;
if (index == 0) {
prevNode = null;
}else{
prevNode = node(index - 1);
}
if (prevNode == null) {
head = nextNode;
targetNode.next = null;
}else {
prevNode.next = nextNode;
targetNode.next = null;
}
targetNode.data = null;
size --;
return o;
}
public int size() {
return size;
}
public void addFirst(Object o) {
Node nextNode = head;
Node newNode = new Node(o, nextNode);
head = newNode;
size++;
}
public void addLast(Object o) {
Node newNode = new Node(o, null);
if (size == 0) {
head = newNode;
}else{
Node lastNode = node(size - 1);
lastNode.next = newNode;
}
size++;
}
public Object removeFirst() {
return remove(0);
}
public Object removeLast() {
return remove(size() - 1);
}
public Iterator iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator {
public Node cursor = head;
@Override
public boolean hasNext() {
return cursor != null;
}
@Override
public Object next() {
Object o = cursor.data;
cursor = cursor.next;
return o;
}
}
private static class Node {
Object data;
Node next;
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
}