230 likes | 363 Views
Linked Lists. many slides taken from Mike Scott, UT Austin. Recursive Data Structures. Linked Lists are dynamic data structures They grow and shrink one element at a time, normally without some of the inefficiencies of arrays Big O of Array Manipulations Access the kth element
E N D
Linked Lists many slides taken from Mike Scott, UT Austin
Recursive Data Structures • Linked Lists are dynamic data structures • They grow and shrink one element at a time, normally without some of the inefficiencies of arrays • Big O of Array Manipulations • Access the kth element • Add or delete an element in the middle of the array while maintaining relative order • adding element at the end of array? space avail? no space avail? • add element at beginning of an array • If accesses are all at beginning or end of list, a linked structure offers improvements • Linked Lists could be used as the underlying storage container for higher level ADTs (stack, queue)
Nodes and Lists • A different way of implementing a list • Each element of a Linked List is a separate Node object. • Each Node tracks a single piece of data plus a reference (pointer) to the next • Create a new Node every time we add something to the List • Remove nodes when item removed from list and allow garbage collector to reclaim that memory
Elements of Linked Lists public class Node { private Object myData; private Node myNext; public Node() { myData = null; myNext = null; } public Node(Object data, Node next) { myData = data; myNext = next; } public Object getData() { return myData; } public Node getNext() { return myNext; } public void setData(Object data) { myData = data; } public void setNext(Node next) { myNext = next; } }
One Implementation of a Linked List • The Nodes shown on the previous slide are singly linked • a node refers only to the next node in the structure • it is also possible to have doubly linked nodes. • The node has a reference to the next node in the structure and the previous node in the structure as well • How is the end of the list indicated • myNext = null for last node • a separate dummy node class / object
A Simple List Interface public interface IList { void add(Object item); void add(Object item, int pos); Object set(Object item, int pos); void add(List other); Object get(int pos); Object remove(int pos); int size(); }
A Linked List Implementation public class LinkedList implements Ilist { private Node myHead; private Node myTail; private int iMySize; public LinkedList() { myHead = null; myTail = null; iMySize = 0; } } LinkedList list = new LinkedList(); LinkedList myHead iMySize myTail null 0 null
Add Element - List Empty (Before) Object item myHead myTail iMySize 0 null null
Add Element - List Empty (After) Node myData myNext null myHead myTail iMySize 1 Object
Add Element - List Not Empty (Before) Object item myHead myTail iMySize 1 Node myData myNext null Object
Add Element - List Not Empty (After) Node myData myNext myHead myTail iMySize 2 Node myData myNext null Object Object
Code for default add • public void add(Object item)
Code for arbitrary add • public void add(Object item, int pos)
Code for get • public Object get(int pos)
Code for remove • public Object remove(int pos)
Why Linked List • Are any operations with a Linked List faster than the version from ArrayList? • What about this: • public void addFront(Object item) • Big O? Array version Big O? • Fast performance for removeFront as well?
Remove Back Method • public Object removeBack() • Big O?
Other Possible Features of Linked Lists • Doubly Linked • Circular • Dummy Nodes for first and last node in list public class DLNode { private Object myData; private DLNode myNext; private DLNode myPrevious; }
Default add for Doubly Linked List • public void add(Object item)
Code for arbitrary add - Doubly Linked List • public void remove(Object item, int pos)
Code for removeDoubly Linked List • public Object remove(int pos)