package com.dataStructure;
public class LinkedList implements List {
private Node head;
private Node now;
private int size = 0;
public void add(Object o) {
if (head == null) {
head = new Node(o, null);
now = head;
} else {
Node node = new Node(o, null);
now.next = node;
now = node;
}
size++;
}
private void rangeCheck(int index) {
if (index < 0 || index > size - 1)
throw new IllegalArgumentException();
}
public void add(int index, Object o) {
rangeCheck(index);
if (index == 0) {
addFirst(o);
} else {
Node node = new Node(o, null);
Node now = head;
Node next = head;
for (int i = 1; i <= index; i++) {
next = next.next;
if (i == index) {
node.next = next;
now.next = node;
}
now = now.next;
}
size++;
}
}
public Object get(int index) {
Node indexNode = head;
if (index == 0)
return indexNode.data;
else {
for (int i = 1; i <= index; i++) {
indexNode = indexNode.next;
if (i == index)
return indexNode.data;
}
}
return null;
}
public Object remove(int index) {
rangeCheck(index);
if (index == 0) {
return removeFirst();
} else {
Node pre = head;
Node now = head;
for (int i = 1; i <= index; i++) {
now = now.next;
if (i == index) {
pre.next = now.next;
}
pre = pre.next;
}
size--;
return now.data;
}
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public void addFirst(Object o) {
Node oldhead = head;
Node newhead = new Node(o, oldhead);
head = newhead;
size++;
}
public void addLast(Object o) {
if(head==null){
addFirst(o);
}else {
Node node = head;
while (node != null) {
node = node.next;
if (node == null) {
Node lastnode = new Node(o, null);
node = lastnode;
}
}
size++;
}
}
public Object removeFirst() {
Node oldhead = head;
Node newhead = head.next;
head = newhead;
size--;
return oldhead.data;
}
public Object removeLast() {
if(size == 1){
Node first = head;
Object data = first.data;
head = null;
size--;
return data;
}else{
Node lastPre = getNode(size-2);
Node last = lastPre.next;
Object data = last.data;
lastPre.next = null;
size--;
return data;
}
}
private Node getNode(int index) {
rangeCheck(index);
Node cur = head;
int i = 0;
while(i <=index){
cur = cur.next;
i++;
}
return cur;
}
public Iterator iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator {
int pos = 0;
@Override
public boolean hasNext() {
return pos < size;
}
@Override
public Object next() {
if (pos > size)
throw new IllegalArgumentException();
return get(pos++);
}
}
private static class Node {
Object data;
Node next;
private Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
}