package a2; public class DLinkedListImpl implements DLinkedList { private static class Node { E value; Node prev; Node next; Node(E eValue, Node nPrev, Node nNext) { value = eValue; prev = nPrev; next = nNext; } Node() {} @Override public boolean equals(Object o) { if (o instanceof Node) { return value.equals(((Node)o).value); } return false; } @Override public String toString() { if (value != null) return value.toString(); return super.toString(); } } Node head; Node tail; int size = 0; public DLinkedListImpl() { tail = new Node(); head = tail; } private boolean addNew(E e) { Node temp = tail; tail = new Node(e, temp, null); temp.next = tail; size++; return true; } public boolean add(E e) { if (!contains(e)) return addNew(e); else { return addR(head, e); } } private boolean addR(Node n, E e) { if (e.equals(n.value) && (n.prev != null)) { Node temp = n.prev; n.prev = new Node(n.value, n.prev, n.next); n = new Node(temp.value, temp.prev, temp.next); //swapNodes(n.prev, n); return true; } if (n.next == null) return false; return (containsR(n.next, e)); } private void swapNodes(Node n1, Node n2) { //NOCH 100% FALSCH Node temp = n1; n1 = new Node(n2.value, n2.prev, n2.next); n2 = new Node(temp.value, temp.prev, temp.next); } public boolean contains(E e) { return containsR(head, e); } private boolean containsR(Node n, E e) { if (e.equals(n.value)) return true; if (n.next == null) return false; return (containsR(n.next, e)); } public boolean remove(E e) { size--; return removeR(head, e); } private boolean removeR(Node n, E e) { if (e.equals(n.value)) { n.prev.next = n.next; n.next.prev = n.prev; return true; } if (n.next == null) return false; return (removeR(n.next, e)); } public int size() { return size; } public static void main(String[] args) { DLinkedListImpl a = new DLinkedListImpl(); System.out.println(a.tail.value); System.out.println("head == tail? " + (a.head == a.tail)); a.add("A"); System.out.println("head == tail? " + (a.head == a.tail)); a.add("B"); a.add("C"); a.add("C"); a.add("C"); a.add("C"); System.out.println(a.tail.value); System.out.println(a.tail.prev.value); System.out.println(a.tail.prev.prev.value); System.out.println(a.tail.prev.prev.prev.value); System.out.println("---"); System.out.println(a.head.value); System.out.println(a.head.next.value); System.out.println(a.head.next.next.value); System.out.println(a.head.next.next.next.value); System.out.println("---"); System.out.println(a.contains("B")); System.out.println("Removing B..."); a.remove("B"); System.out.println(a.contains("B")); System.out.println(a.size()); System.out.println("---"); System.out.println(a.head.value); System.out.println(a.head.next.value); System.out.println(a.head.next.next.value); } }