In this chapter, we continue to study implementations of the 
 interface, this time using pointer-based data structures rather than
arrays.  The structures in this chapter are made up of nodes that
contain the list items.  Using references (pointers), the nodes are
linked together into a sequence.  We first study singly-linked lists,
which can implement
interface, this time using pointer-based data structures rather than
arrays.  The structures in this chapter are made up of nodes that
contain the list items.  Using references (pointers), the nodes are
linked together into a sequence.  We first study singly-linked lists,
which can implement 
 and (FIFO)
 and (FIFO) 
 operations in constant
time per operation and then move on to doubly-linked lists, which can
implement
 operations in constant
time per operation and then move on to doubly-linked lists, which can
implement 
 operations in constant time.
 operations in constant time.
Linked lists have advantages and disadvantages when compared to array-based
implementations of the 
 interface.  The primary disadvantage is that
we lose the ability to access any element using
 interface.  The primary disadvantage is that
we lose the ability to access any element using 
 or
 or 
 in constant time.  Instead, we have to walk through the list, one element
at a time, until we reach the
in constant time.  Instead, we have to walk through the list, one element
at a time, until we reach the 
 th element.  The primary advantage is
that they are more dynamic:  Given a reference to any list node
th element.  The primary advantage is
that they are more dynamic:  Given a reference to any list node 
 , we
can delete
, we
can delete 
 or insert a node adjacent to
 or insert a node adjacent to 
 in constant time. This
is true no matter where
 in constant time. This
is true no matter where 
 is in the list.
 is in the list.