Singly Linked List
Singly Linked List
import java.util.Iterator;
import java.util.List;
/**
*
* @author Vo Hoang Tu - CE000000
*/
public class SinglyLinkedList<T> implements Iterable<T> {
Node<T> head;
Node<T> tail;
public SinglyLinkedList() {
head = null;
tail = null;
}
public T removeFirst() {
if (isEmpty()) {
throw new RuntimeException("An empty singly linked list!");
}
T data = head.data;
if (head == tail) {
head = tail = null;
return data;
}
head = head.next;
return data;
}
public T removeLast() {
if (isEmpty()) {
throw new RuntimeException("An empty singly linked list!");
}
T data = tail.data;
if (head == tail) {
head = tail = null;
return data;
}
Node<T> currentNode = head;
while (currentNode.next != tail) {
currentNode = currentNode.next;
}
tail = currentNode;
currentNode.next = null;
return data;
}
public T getFirst() {
if (isEmpty()) {
throw new RuntimeException("An empty singly linked list!!!");
}
return head.data;
}
public T getLast() {
if (isEmpty()) {
throw new RuntimeException("An empty singly linked list!!!");
}
return tail.data;
}
//[7,5,9,10,12,34]
@Override
public String toString() {
String res = "";
Node<T> currentNode = head;
while (currentNode != null) {
res += currentNode.data + ",";
currentNode = currentNode.next;
}
//7,5,9,10,12,34,
return "[" + res.substring(0, res.length() - 1) + "]";
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
Node<T> currentNode = head;
@Override
public boolean hasNext() {
return currentNode != null;
}
@Override
public T next() {
T data = currentNode.data;
currentNode = currentNode.next;
return data;
}
};
}