New to the site. Trying to implement a generic SinglyLinkedList, fetch returns null even though there are nodes inserted and delete method return false, when true is expected. In addition, it functions just fine when I decide to fetch or delete in reverse order. Looking for a set of fresh eyes to see what I am missing. Thanks-in-advance. public class MainSinglyLinkedList { public static void main(String[] args) { SinglyLinkedList <Listing> boston = new SinglyLinkedList<Listing>(); Listing l1 = new Listing("Bill", "1st Avenue", "123 4567"); Listing l2 = new Listing("Al", "2nd Avenue", "456 3232"); Listing l3 = new Listing("Mike", "3rd Avenue", "333 3333"); boston.insert(l1); // test insert boston.insert(l2); boston.insert(l3); boston.showAll(); System.out.println("***********************************************"); System.out.println(boston.fetch("Mike").toString()); //boston.delete("Al"); // test delete of Al System.out.println( boston.delete("Bill")); //System.out.println( boston.delete("Mike")); //System.out.println( boston.delete("Al")); //System.out.println( boston.delete("Bill")); //System.out.println("-----------------------------------------------"); boston.showAll(); //boston.update("Mike", l2); // test update of Mike to Al //System.out.println(boston.update("Mike", l2)); //boston.showAll(); SinglyLinkedList <StudentListing> Form4East = new SinglyLinkedList<StudentListing>(); StudentListing bill = new StudentListing("Bill", "2988050", "3.9"); StudentListing mary = new StudentListing("Mary", "2988051", "3.5"); StudentListing tom = new StudentListing("Tom", "2988052", "1.7"); System.out.println(Form4East.insert(bill)); System.out.println(Form4East.insert(mary)); System.out.println(Form4East.insert(tom)); System.out.println(Form4East.fetch("Tom")); System.out.println(Form4East.fetch("Bill")); System.out.println(Form4East.fetch("Mary")); System.out.println(Form4East.fetch("Bill")); System.exit(0); } } public class SinglyLinkedList<T> { private Node<T> h; // list header public SinglyLinkedList() { h = new <T> Node(); // dummy node h.l = null; h.next = null; } public boolean insert(T newNode) { Node n = new Node(); GenericNode node = (GenericNode) newNode; if (node == null) // out of memory { return false; } else { n.next = h.next; h.next = n; n.l = (T) node.deepCopy(); return true; } } public GenericNode fetch(Object targetKey) { Node p = h.next; GenericNode node = (GenericNode) p.l; while (p != null && !(node.compareTo(targetKey) == 0)) { p = p.next; } if (p != null) { return node.deepCopy(); } else { return null; } } public boolean delete(Object targetKey) { Node q = h; Node p = h.next; GenericNode node = (GenericNode)p.l; while (p != null && !(node.compareTo(targetKey) == 0)) { q = p; p = p.next; } if (p != null) { q.next = p.next; return true; } else { return false; } } public boolean update(Object targetKey, T newNode) { if (delete(targetKey) == false) { return false; } else if (insert(newNode) == false) { return false; } return true; } public void showAll() { Node p = h.next; while (p != null) //continue to traverse the list { System.out.println(p.l.toString()); p = p.next; } } /** * * @param <T> */ public class Node <T> { private T l; private Node <T> next; public <T> Node() { } }// end of inner class Node } public class Listing implements GenericNode{ private String name; // key field private String address; private String number; public Listing(String n, String a, String num) { name = n; address = a; number = num; } public String toString() { return ("Name is " + name + "\nAddress is " + address + "\nNumber is " + number + "\n"); } public Listing deepCopy() { Listing clone = new Listing(name, address, number); return clone; } public int compareTo(Object targetKey) { String tKey = (String) targetKey; return (name.compareTo(tKey)); } public void setAddress(String a) // coded to demonstrate encapsulation { address = a; } } public class StudentListing implements GenericNode { // instance variables - replace the example below with your own private String name; // keyfield private String identification_no; private String gpa; /** * Constructor for objects of class StudentListings * * @ param n- name of the student * @ param id- identification number of the student * @ param g- gpa of the student */ public StudentListing(String n, String id, String g) { // initialise instance variables name = n; identification_no = id; gpa = g; } /** * toString method annotates the student info for display * * @ return name - name of the student * @ return identification_no - identification number of the student * @ return gpa - grade point average of the student */ public String toString() { return ("Name is " + name + "\nIdentification Number is " + identification_no + "\nGpa is " + gpa + "\n"); } /** * deepCopy method copies the content on the StudentListings object that * invokes it to a new StudentListings object and returns the clone. * * @ return clone - copy of the StudentListings that invoked it */ public StudentListing deepCopy() { StudentListing clone = new StudentListing(name, identification_no, gpa); return clone; } /** * compareTo method compares the targetKey to the keyfield name * * @ return - 0, if the argument string is equal to this string */ public int compareTo(Object targetKey) { String tKey = (String) targetKey; return (name.compareTo(tKey)); } /** * setName method, sets the name of the student a param n- name of the * student */ public void setName(String n) { name = n; } /** * setId method, sets the id of the student a param n- name of the student */ public void setId(String id) { identification_no = id; } /** * setName method, sets the name of the student a param n- name of the * student */ public void setGpa(String g) { gpa = g; } /** * input method, allowers for user to input data * */ public void input() { name = JOptionPane.showInputDialog("Enter a name"); identification_no = JOptionPane.showInputDialog("Enter an identification number"); gpa = JOptionPane.showInputDialog("Enter a gpa"); } //end of inputStudentListings method }//end of class StudentListings