/** * Implementation of the LinkedListInterface * For all public methods, see documentation in LinkedListInterface * * @author gtowell * Created: April 2021 * @param */ public class SingleLinkedList implements LinkedListInterface { protected class Node { public H data; public Node next; public Node(H data) { this.data = data; this.next = null; } } protected Node head = null; public int size() { int siz = 0; Node n = head; while (n != null) { siz++; n = n.next; } return siz; } public boolean isEmpty() { return head == null; } @Override public J first() { return head.data; } private Node lastNode() { Node n = head; if (n == null) return null; while (n.next != null) { n = n.next; } return n; } @Override public J last() { Node n = lastNode(); if (n == null) return null; return n.data; } @Override public void addLast(J c) { Node n = lastNode(); Node newnode = new Node<>(c); if (n == null) { head = newnode; return; } n.next = newnode; } @Override public void addFirst(J c) { Node newnode = new Node<>(c); if (head == null) { head = newnode; return; } newnode.next = head; head = newnode; } @Override public J removeFirst() { if (head == null) return null; Node tmp = head; head = head.next; return tmp.data; } @Override public J removeLast() { if (head == null) return null; Node prev = head; Node here = head.next; if (here == null) { // only one item in list head = null; return prev.data; } while (here.next != null) { prev = here; here = here.next; } prev.next = null; return here.data; } @Override public boolean remove(J r) { if (head == null) return false; Node prev = null; Node here = head; while (here.next != null) { if (here == r) break; prev = here; here = here.next; } if (here.data == r) { if (prev == null) head = head.next; else prev.next = here.next; return true; } return false; } public String toString() { StringBuffer sb = new StringBuffer(); for (Node node = head; node != null; node = node.next) { sb.append(node.data.toString()); sb.append("\n"); } return sb.toString(); } }