package week01.basic;
public class MyLinkedList implements List {
private Node head;
private int size;
public void add(Object o) {
// 空链表
if (head == null) {
head = new Node();
head.data = o;
head.next = null;
} else {
Node p = head;
while (p.next != null) {
p = p.next;
}
Node target = new Node();
target.data = o;
target.next = null;
p.next = target;
}
size++;
}
public void add(int index, Object o) {
// index 是否合法
checkPositionIndex(index);
if (head == null) {
head = new Node();
head.data = o;
head.next = null;
} else {
if (index == 0) {
addFirst(o);
} else if (index == size) {
addLast(o);
} else {
Node p = new Node();
Node p1 = head;
for (int i = 0; i < index - 1; i++) {
p1 = p1.next;
}
p.data = o;
p.next = p1.next;
p1.next = p;
size++;
}
}
}
public Object get(int index) {
checkElementIndex(index);
Node p = head;
for (int i = 0; i < index; i++) {
p = p.next;
}
return p.data;
}
public Object remove(int index) {
checkElementRemove();
checkElementIndex(index);
Object removeObject = null;
if (index == 0) {
removeObject = removeFirst();
} else if (index == (size - 1)) {
removeObject = removeLast();
} else {
Node p = head;
for (int i = 1; i < index; i++) {
p = p.next;
}
removeObject = p.next.data;
p.next = p.next.next;
size--;
}
return removeObject;
}
public int size() {
return size;
}
public void addFirst(Object o) {
if (head == null) {
head = new Node();
head.data = o;
head.next = null;
} else {
Node p = new Node();
p.data = o;
p.next = head;
head = p;
}
size++;
}
public void addLast(Object o) {
add(o);
}
public Object removeFirst() {
checkElementRemove();
Object removeObject = head.data;
head = head.next;
size--;
return removeObject;
}
public Object removeLast() {
checkElementRemove();
Object removeObject = null;
if (size == 1) {
removeObject = head.data;
head = head.next;
} else {
Node p = head;
for (int i = 0; i < size; i++) {
if (p.next.next == null) {
removeObject = p.next.data;
p.next = null;
break;
} else {
p = p.next;
}
}
}
size--;
return removeObject;
}
private boolean isEmpty() {
return size == 0;
}
private void checkElementRemove() {
if (isEmpty()) {
throw new NullPointerException("The list is empty.");
}
}
private void checkElementIndex(int index) {
if (!isElementIndex(index)) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
}
}
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
}
private void checkPositionIndex(int index) {
if (!isPositionIndex(index)) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
}
}
private boolean isPositionIndex(int index) {
return index >= 0 && index <= size;
}
public Iterator iterator() {
return new MyLinkedListIterator(this);
}
private class MyLinkedListIterator implements Iterator {
private MyLinkedList list = null;
private int position = 0;
private MyLinkedListIterator(MyLinkedList list) {
this.list = list;
}
@Override
public boolean hasNext() {
if ((position + 1) > size()) {
return false;
}
return true;
}
@Override
public Object next() {
return list.get(position++);
}
}
private static class Node {
Object data;
Node next;
}
@Override
public String toString() {
String elementStr = "";
Node p = head;
while (p != null) {
elementStr += p.data + ",";
p = p.next;
}
return "MyLinkedList: { size=" + size + ", elementData=" + "["
+ elementStr.substring(0, elementStr.length() - 1) + "]" + " }";
}
}