Operations on a linked list
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   The standard operations
       defined on
       a linked list include:
 
 | 
  Tests if a
    list is
   empty
 
  Get the
    item at the
    start
    
     (of the linked list)
 
  Get the
    item at the
    
   end
     (of the linked list)
 
  Insert an
    item at the
    start
    
     (of the linked list)
 
  Insert an
    item at the
    
  end
     (of the linked list)
 
  Delete the
    item at the
    start
    
     (of the linked list)
 
  Delete the
    item at the
    
   end
     (of the linked list)
 
 
  
  Get the
    item at 
  position k
   in the
   linked list
  Remove the
 (first)
    item
  that contains
  the value key
   from
    the linked list)
  |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  A simple 
   List interface definition 
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
 Important note:
 
 | 
  There are 
  
   many kinds of
    linked list that uses
    
   different
    linking structures
 
  |  
 To 
  unify 
    different kinds of
   linked list, we 
   define a
   
  SimpleList
   interface
  ("parent class"):
 
 | 
interface SimpleList<T>  // A list that store objects of type T
{
    public boolean isEmpty();      // Check if the list is empty
    public T getFirst();           // Return data in first node of list
    public T getLast();            // Return data in last  node of list
    public void addFirst(T item);  // Insert "item" at front of list
    public T removeFirst();        // Remove node from the front of list
    public void addLast(T item);   // Insert "item" at end of list
    public T removeLast();         // Remove node from the end of list
    public T get(int pos);         // Return item stored in node at pos
    public void remove(T key);     // Remove node containg "key"
}  |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Designing  a 
  (generic)
  linked list class
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   Our GenericLinkedList class
      
      must
    implement the
    
  SimpleList<T>
      interface:
 
 | 
public class GenericLinkedList<T> implements SimpleList<T>
{
   // Need variable to store a linked list...  Any ideas ?
   
   // Need a constructor to initialize the variables
    public boolean isEmpty()     ...  // Must implemet
                                      // all the methods
    public T getFirst()          ...  // declared in the
    public T getLast()	         ...  // SimpleList interface
    public void addFirst(T item) ...
    public T removeFirst()       ...
    public void addLast(T item)	 ...
    public T removeLast()        ...
    public T get(int pos)        ...
    public void remove(T key)    ...
}
 |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
    Designing  a 
  (generic)
  linked list class
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
    Designing  a 
  (generic)
  linked list class
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
 Designing  a 
  (generic)
  linked list class
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   Designing a
    class that
    implements 
    SimpleList<T>:
 
 | 
public class GenericLinkedList<T> implements SimpleList<T>
{
    private Node<T> first;       // The list starts at first
    // Constructs an empty list
    public GenericLinkedList()    ...
    public boolean isEmpty()     ...  // Must implemet
                                      // all the methods
    public T getFirst()          ...  // declared in the
    public T getLast()	         ...  // SimpleList interface
    public void addFirst(T item) ...
    public T removeFirst()       ...
    public void addLast(T item)	 ...
    public T removeLast()        ...
    public T get(int pos)        ...
    public void remove(T key)    ...
}
 |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Designing the Node class
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   A Node of a
    simple list (= singly chained) contains:
 
 | 
  A data
        field
        (let's call it item)
  A link 
     field
   (let's call it link)
  |  
 A linked list of
     
  Integer data
     will have a Node class
     that contains an
  
  Integer:
 
 | 
    public class Node 
    {
       // Node instance variable is generic
       private Integer item;
       private Node    next;
       // Constructor for Node
       public Node(Integer item, Node next)
       {
          this.item = item;
          this.next = next;
       }
       public String toString(){ return "" + this.item; }
    } 
 |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Designing the Node class
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   A Node of a
    simple list (= singly chained) contains:
 
 | 
  A data
        field
        (let's call it item)
  A link 
     field
   (let's call it link)
  |  
 
     However,
   a linked list of
     
  Circle
   objects
     will contain
   a Circle variable:
 
 | 
    private class Node 
    {
       // Node instance variable is generic
       public Circle  item;
       private Node    next;
       // Constructor for Node
       public Node(Circle  item, Node next)
       {
          this.item = item;
          this.next = next;
       }
       public String toString(){ return "" + this.item; }
    } 
 |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Designing the Node class
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   A Node of a
    simple list (= singly chained) contains:
 
 | 
  A data
        field
        (let's call it item)
  A link 
     field
   (let's call it link)
  |  
 There, to
     be as flexible
     as possible,
     we use a
     
     generic (parameterized) class:
 
 | 
    public class Node<T> 
    {
       // Node instance variable is generic
       private  T      item;
       private Node    next;
       // Constructor for Node
       public Node( T      item, Node next)
       {
          this.item = item;
          this.next = next;
       }
       public String toString(){ return "" + this.item; }
    } 
 |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Implementation note:
   inner classes
   and
   nested classes
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   Inner class:
 
 | 
  A 
  
   class that is
    defined inside
    another class is
    called a
   
  inner class
  |  
Example:
 
 
 | 
   public class OuterClass
   {
       ....
       private class InnerClass
       {
           ....
       }
   }
 |  
 We call
   this kind of 
  class arrangement:
     
  
    nested classes
 The 
  purpose
      of nested classes
      is to 
 
   group classes
        that belong together
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Inner classes
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   The relationship
    between the inner class
    and it's outer class:
 
 | 
  The scope of an
    inner class is
    bounded by the
    outer class
  
  I.e.:
 
 
 | 
   the
     inner class 
     does not exists
     independently from the
     outer class
  |  
  
  The inner class has
     access to
   all
     members
     (including private) of
     its outer class
 
  The outer class
      do not have
     access to the
    private members of an
    inner class
  |  
 
      When to 
    use an
  inner class:
 
 | 
  If a class is
      useful
      
      only to
      one other class, it's
      more logical to:
 
 | 
  Embed this
    class as an
    inner class to
    keep the 2 classes
    together...
  |  
  |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Initial design of a 
  (generic)
  linked list class
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   Because 
    
    only
    the 
  
   methods inside
    GenericLinkedList class
    will use the
   
   Node class,
   we will make it an 
 inner class:
  of GenericLinkedList class:
 
 | 
public class GenericLinkedList<T> implements SimpleList<T>
{
    private class Node<T>  // Inner class
    {
       // Node instance variable is generic
       private T item;
       private Node<T> next;
       // Constructor for Node
       public Node(T item, Node<T> next)
       {
          this.item = item;
          this.next = next;
       }
       public String toString(){ return "" + this.item; }
    } // End of private inner class "Node"
    private Node<T> first;
    // Constructs an empty list
    public GenericLinkedList()    ...
    // Other methods omitted for brevity...
}
 |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  A note on 
  the constructor of the
   Node class
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   Notice that
      the 
  constructor of
      the Node class
      initializes the
      
   
   next member variable
      using the
      2nd input parameter:
 
 | 
public class GenericLinkedList<T> implements SimpleList<T>
{
    private class Node<T>  // Inner class
    {
       // Node instance variable is generic
       private T item;
       private Node<T> next;
       // Constructor for Node
       public Node(T item, Node<T> next)
       {
          this.item = item;
          this.next = next;
       }
       public String toString(){ return "" + this.item; }
    } // End of private inner class "Node"
    private Node<T> first;
    // Constructs an empty list
    public GenericLinkedList()    ...
    // Other methods omitted for brevity...
}
 |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  The empty list
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   Recall that
      a linked list is
      stored as
      follows:
   
Specifically:
 
 
 | 
  The 
    linking field in the
      
     last node
     contains null
  |  
 An empty list is
    therefore
    represented as
    follows:
   
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  Constructor of the
  GenericLinkedList class:
     making an empty list
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   The 
  constructor 
   in the GenericLinkedList class
      makes an
      
  empty list 
      by setting
      the variable
      
   first to
      null:
 
 | 
public class GenericLinkedList<T> implements SimpleList<T>
{
    private class Node<T>
    {
        // Class content omitted for brevity...
    } // End of private inner class "Node"
    private Node<T> first;
    // Constructs an empty list
    public GenericLinkedList()   // <---- Constructor
    {
        first = null;    // Initialize list to empty list
    }
    // Other methods omitted for brevity...
} |  
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
    isEmpty():
    test if a list is empty 
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   The isEmpty() method
      returns 
  true if
  the list is
  empty (i.e., when
  first == null and
  false
  otherwise:
 
 | 
public class GenericLinkedList<T> implements SimpleList<T>
{
    private class Node<T>
    {
        // Class content omitted for brevity...
    } // End of private inner class "Node"
    private Node<T> first;
    // Returns true if the list is empty
    public boolean isEmpty()    // <---- isEmpty()
    {
        return first == null;
    }
    // Other methods omitted for brevity...
} |  
   | 
  
  
  
  
  
  The 
  
  other operations is
  more complex and
  will be 
  
   discusses in the
  next few slides.
  
  
  
  
  
 
  
  
  
  
  
  
  Summary
  
  
  
  
  
  
  
  
  
  
  
  
  
   | 
   Review of the
      SumpleList interface:
 
 | 
interface SimpleList<T>  // A list must implement these methods 
{
    public boolean isEmpty();
    public T getFirst();
    public T getLast();
    public void addFirst(T item);
    public T removeFirst();
    public void addLast(T item);
    public T removeLast();
    public T get(int pos);
    public void remove(T key);
}  |  
 We have implement the
     isEmpty()
     method
 We will study the
    
 addFirst() and
     
  removeFirst()
     methods
     next
   | 
  
  
  
  
  
  
  
  
  
  
 
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 
  
  
       ❮
  
       ❯