package cn.net.pikachu.basic;
import java.util.NoSuchElementException;
public class LinkedList implements List {
private Node head;
private int curSize = 0;
private class Itr implements Iterator {
Node curNode = head;
@Override
public boolean hasNext() {
return curNode != null;
}
@Override
public Object next() {
Node node = curNode;
curNode = curNode.next;
return node.data;
}
}
public void add(Object o) {
if (head == null) {
head = new Node(o, null);
} else {
Node node = head;
while (node.next != null) {
node = node.next;
}
node.next = new Node(o, null);
}
curSize++;
}
public void add(int index, Object o) {
// 这里可以等于
if (index < 0 || index > curSize) {
throw new IndexOutOfBoundsException(String.valueOf(index));
}
if (index == 0) {
addFirst(o);
} else {
Node node = head;
for (int i = 1; i < index; i++) {
node = node.next;
}
node.next = new Node(o, node.next);
curSize++;
}
}
public Object get(int index) {
if (index < 0 || index >= curSize) {
throw new IndexOutOfBoundsException(String.valueOf(index));
}
Node node = head;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node.data;
}
public Object remove(int index) {
if (index < 0 || index >= curSize) {
throw new IndexOutOfBoundsException(String.valueOf(index));
}
if (index == 0) {
return removeFirst();
}
Node node = head;
for (int i = 1; i < index; i++) {
node = node.next;
}
Node t = node.next;
node.next=t.next;
curSize--;
return t.data;
}
public int size() {
return curSize;
}
public void addFirst(Object o) {
Node node = new Node(o, head);
head = node;
curSize++;
}
public void addLast(Object o) {
add(o);
}
public Object removeFirst() {
if (head == null) {
throw new NoSuchElementException();
}
Node node = head;
head = head.next;
curSize--;
return node.data;
}
public Object removeLast() {
if (head == null) {
throw new NoSuchElementException();
}
Node node;
if (head.next == null) {
node = head;
head = null;
} else {
node = head;
while (node.next.next != null) {
node = node.next;
}
Node t = node.next;
node.next = null;
node = t;
}
curSize--;
return node.data;
}
// 后面再实现
public Iterator iterator() {
return new Itr();
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[");
Node node = head;
while (node != null) {
builder.append(node.data).append(",");
node = node.next;
}
if (curSize>0)
builder.deleteCharAt(builder.length() - 1);
builder.append("]");
return builder.toString();
}
private static class Node {
Object data;
Node next;
Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
}