230 likes | 365 Views
Learn about the benefits and implementations of linked lists compared to arrays, and practical code examples for adding, removing, and accessing elements. Discover the efficiency and flexibility of using linked lists in your data structures.
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)