package list;
/**
* @author jiaxun
*/
public class SinglyLinkedList implements List {
private Node head;
private int size;
public SinglyLinkedList() {
size = 0;
}
public void addFirst(Object data) {
Node node = new Node(data);
node.setNext(head);
head = node;
size++;
}
public Node removeFirst() {
Node object = head;
head = object.getNext();
size--;
return object;
}
public Node removeLast() {
Node curr = head;
Node prev = null;
while (curr != null) {
prev = curr;
curr = curr.getNext();
}
if (prev != null) {
prev.setNext(null);
}
size--;
return curr;
}
public Node get(int index) {
if (index > size) {
throw new IndexOutOfBoundsException();
}
Node curr = head;
while (curr != null) {
if (index == 0)
break;
curr = curr.getNext();
index--;
}
return curr;
}
public Node remove(int index) {
Node curr = head;
Node prev = null;
while (curr != null) {
if (index == 0)
break;
prev = curr;
curr = curr.getNext();
index--;
}
if (prev != null) {
prev.setNext(curr.getNext());
curr.setNext(null);
}
size--;
return curr;
}
public void addLast(Object object) {
if (head == null) {
head = new Node(object);
} else {
Node curr = head;
Node prev = null;
while (curr != null) {
prev = curr;
curr = curr.getNext();
}
prev.setNext(new Node(object));
}
size++;
}
@Override
public void add(Object o) {
}
public void add(int index, Object object) {
Node curr = head;
Node prev = null;
while (curr != null) {
if (index == 0)
break;
prev = curr;
curr = curr.getNext();
index--;
}
if (prev != null) {
Node newNode = new Node(object);
newNode.setNext(curr);
prev.setNext(newNode);
size++;
}
}
public int size() {
return size;
}
public Iterator iterator() {
return new SinglyLinkedListIterator(this);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
Node current = head;
while (current != null) {
builder.append(current.toString());
current = current.getNext();
}
return builder.toString();
}
private class SinglyLinkedListIterator implements Iterator {
private SinglyLinkedList linkedList;
private int currentPosition = 0;
public SinglyLinkedListIterator(SinglyLinkedList linkedList) {
this.linkedList = linkedList;
}
@Override
public boolean hasNext() {
return currentPosition < size;
}
@Override
public Object next() {
return linkedList.get(currentPosition++);
}
@Override
public Object remove() {
return linkedList.remove(--currentPosition);
}
}
private static class Node {
private Object data;
private Node next;
public Node(Object data) {
this.data = data;
}
public Object getData() {
return data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return "[data is " + getData() + "]";
}
}
}