660 likes | 672 Views
Linked Lists. A linked list is a sequence in which there is a defined order as with any sequence but unlike array and Vector there is no property of contiguity of memory. Singly-linked Lists. A list in which there is a preferred direction. A minimally linked list.
E N D
Linked Lists • A linked list is a sequence in which there is a defined order as with any sequence but unlike array and Vector there is no property of contiguity of memory.
Singly-linked Lists • A list in which there is a preferred direction. • A minimally linked list. • The item before has a pointer to the item after.
Singly-linked List • Implement this structure using objects and references.
4 11 1 7 Singly-linked List head
4 11 1 7 Singly-linked List head
Singly-linked List class ListElement { Object datum ; ListElement nextElement ; . . . } datum nextElement
Singly-linked List ListElement newItem = new ListElement(new Integer(4)) ; ListElement p = null ; ListElement c = head ; while ((c != null) && !c.datum.lessThan(newItem)) { p = c ; c = c.nextElement ; } newItem.nextElement = c ; p.nextElement = newItem ;
4 11 1 7 Singly-linked List newElement p c head
Analysing Singly-linked List • Accessing a given location is O(n). • Setting a given location is O(n). • Inserting a new item is O(n). • Deleting an item is O(n) • Assuming both a head at a tail pointer, accessing, inserting or deleting can be O(1).
Doubly-linked Lists • A list without a preferred direction. • The links are bidirectional: implement this with a link in both directions.
Doubly-linked List head tail
Doubly-linked List head tail
Doubly-linked List class ListElement { Object datum ; ListElement nextElement ; ListElement previousElement ; . . . } previousElement datum nextElement
Doubly-linked List ListElement newItem = new ListElement(new Integer(4)) ; ListElement c = head ; while ((c.next != null) && !c.next.datum.lessThan(newItem)) { c = c.nextElement ; } newItem.nextElement = c.nextElement ; newItem.previousElement = c ; c.nextElement.previousElement = newItem ; c.nextElement = newItem ; Spot the deliberate mistake. What needs to be done to correct this?
Doubly-linked List head c newItem tail
Doubly-linked List • Performance of doubly-linked list is formally similar to singly linked list. • The complexity of managing two pointers makes things very much easier since we only ever need a single pointer into the list. • Iterators and editing are made easy.
Doubly-linked List • Usually find the List type in a package is a doubly-linked list. • Singly-linked list are used in other data structures.
Stack and Queue • Familiar with the abstractions of stack and queue.
Stack push pop isEmpty top
Queue isEmpty remove insert
Implementing Queue head tail
Multi-lists • Multi-lists are essentially the technique of embedding multiple lists into a single data structure. • A multi-list has more than one next pointer, like a doubly linked list, but the pointers create separate lists.
Multi-lists head
Multi-lists head
Multi-lists (Not Required) head head
Linked Structures • A doubly-linked list or multi-list is a data structure with multiple pointers in each node. • In a doubly-linked list the two pointers create bi-directional links • In a multi-list the pointers used to make multiple link routes through the data.
Linked Structures • What else can we do with multiple links? • Make them point at different data: create Trees (and Graphs).
Trees degree root children parent Level 1 Level 2 node Level 3 leaf node height = depth = 3
Trees • Crucial properties of Trees: • Links only go down from parent to child. • Each node has one and only one parent (except root which has no parent). • There are no links up the data structure; no child to parent links. • There are no sibling links; no links between nodes at the same level.
Trees • If we relax the restrictions, it is not a Tree, it is a Graph. • A Tree is a directed, acyclic Graph that is single parent.
Trees • Binary Trees have degree 2. • Red–Black Trees and AVL Trees are Binary Trees with special extra properties; they are balanced. • B-Trees, B+-Trees, B*-Trees are more complicated Trees with flexible branching factor: these are used very extensively in databases.
Binary Trees • Trees are immensely useful for sorting and searching. • Look at Binary Trees as they are the simplest.
Binary Trees This is a complete binary tree.
Binary Trees • How to insert something in the list? • Need a metric, there must be an order relation defined on the nodes. • The elements are in the tree in a given order; assume ascending order.
Binary Trees • Inserting an element in the Binary Tree involves: • If the tree is empty, insert the element as the root.
Binary Trees • If the tree is not empty: • Start at the root. • For each node decide whether the element is the same as the one at the node or comes before or after it in the defined order. • When the child is a null pointer insert the element.
Binary Tree 37 root 37
Binary Tree 37, 9, 3 root 37 9 3
Binary Trees 37, 9, 3, 68, 14, 54 root 37 9 68 3 14 54
Binary Trees Delete this one
Binary Trees Delete this one
Binary Trees Assume ascending order.
Binary Trees Delete this one
Binary Trees Assume ascending order.
Binary Tree • In Java: class Unit { public Unit(Object o, Unit l, Unit r) { datum = o ; left = l ; right = r ; } Object datum ; Unit left ; Unit right ; }
Binary Tree • Copying can be done recursively: public Object clone() { return new Unit(datum, (left != null) ? ((Unit)left).clone() : null, (right != null) ? ((Unit)right).clone() : null ) ; }
Binary Tree • Can take a tour around the tree, doing something at each stage: void inOrder (Function f) { if (left != null) { left.inOrder(f) ; } f.execute(this) ; if (right != null) { right.inOrder(f); } }
Binary Tree • Can take a different tour around the tree, doing something at each stage: void preOrder (Function f) { f.execute(this) ; if (left != null) { left.preOrder(f) ; } if (right != null) { right.preOrder(f); } }