/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/java-new/2020-12-23/LinkedListProg.java


public class LinkedListProg {
    public static void main (String [] args) {
        Person p1 = new Person ("Anton", "Berta");
        Person p2 = new Person ("Caesar", "Dora");
        Person p3 = new Person ("Emil", "Friedrich");
        LinkedLst lst = new LinkedLst (p1);
        System.out.println (lst.getFirst().getName());
        lst.setFirst (p2);
        System.out.println (lst.getFirst().getName());
        lst.setFirst (p3);
        System.out.println (lst.getFirst().getName());
        lst.rmFirst ();
        System.out.println (lst.getFirst().getName());
        lst.rmFirst ();
        System.out.println (lst.getFirst().getName());
        lst.rmFirst ();
        System.out.println (lst.getFirst().getName());
        lst.rmFirst ();
        System.out.println (lst.getFirst().getName());

    }
    

    static public class Person {
        public String firstname;
        public String lastname;
        
        Person (String firstname, String lastname) {
            this.firstname = firstname;
            this.lastname = lastname;
        }
        
        String getName () {
            return this.firstname + this.lastname;
        }
        
        String getLastName () {
            return this.lastname;
        }
        
        String getFirstName () {
            return this.firstname;
        }
    }
    static public class LinkedLst {
        public Entry head;
        
        LinkedLst (Person p) {
            head = new Entry (p, null, null);
            this.head.prev = head;
            this.head.next = head;
        }
    
        Person getFirst () {
            return this.head.val;
        }
        void setFirst (Person p) {
            Entry ptr = new Entry (p, head, null);
            ptr.prev = ptr;
            head.prev = ptr;
            head = ptr;
        }
        void rmFirst () {
            if ((head != null) && (head.next != null) && (head.next != head)) {
                Person val = head.val;
                head.next.prev = head.next;
                head = head.next;
            }
        }
        
        static public class Entry {
            Person val;
            Entry next;
            Entry prev;
            
            Entry (Person val, Entry next, Entry prev) {
                this.val = val;
                this.next = next;
                this.prev = prev;
            }
        }
    }
}