(c) 2002-2003 University of Washington16-1 CSC 143 Java Lists via Links Reading: Ch. 23.

Slides:



Advertisements
Similar presentations
Chapter 22 Implementing lists: linked implementations.
Advertisements

Singly linked lists Doubly linked lists
Stacks, Queues, and Deques. 2 A stack is a last in, first out (LIFO) data structure Items are removed from a stack in the reverse order from the way they.
CSC 205 – Java Programming II Lecture 25 March 8, 2002.
An Array-Based Implementation of the ADT List public class ListArrayBased implements ListInterface { private static final int MAX_LIST = 50; private Object.
Topic 11 Linked Lists -Joel Spolsky
CSE 143 Lecture 22: Advanced List Implementation (ADTs; interfaces; abstract classes; inner classes; generics; iterators)
CS 106 Introduction to Computer Science I 05 / 03 / 2010 Instructor: Michael Eckmann.
CS 307 Fundamentals of Computer Science 1 Linked Lists many slides taken from Mike Scott, UT Austin.
Stacks, Queues, and Deques
CS 106 Introduction to Computer Science I 04 / 30 / 2010 Instructor: Michael Eckmann.
Stacks, Queues, and Deques
(c) University of Washingtonhashing-1 CSC 143 Java Hashing Set Implementation via Hashing.
Implementing Stacks Ellen Walker CPSC 201 Data Structures Hiram College.
1 Joe Meehean.  Conceptual Picture N items chained together using pointers pointed to by head variable  Advantage allows list to grow indefinitely without.
Arrays and Linked Lists "All the kids who did great in high school writing pong games in BASIC for their Apple II would get to college, take CompSci 101,
(c) University of Washington14-1 CSC 143 Java Collections.
Information and Computer Sciences University of Hawaii, Manoa
Data Design and Implementation. Definitions of Java TYPES Atomic or primitive type A data type whose elements are single, non-decomposable data items.
1/20/03A2-1 CS494 Interfaces and Collection in Java.
CS 307 Fundamentals of Computer ScienceLinked Lists 1 Topic 14 Linked Lists "All the kids who did great in high school writing pong games in BASIC for.
(c) University of Washington15-1 CSC 143 Java List Implementation via Arrays Reading: 13.
2014-T2 Lecture 19 School of Engineering and Computer Science, Victoria University of Wellington  Marcus Frean, Lindsay Groves, Peter Andreae, and John.
CSE 143 Lecture 24 Advanced collection classes (ADTs; abstract classes; inner classes; generics; iterators) read 11.1, 9.6, , slides.
2013-T2 Lecture 18 School of Engineering and Computer Science, Victoria University of Wellington  Marcus Frean, Lindsay Groves, Peter Andreae, and John.
(c) University of Washington16-1 CSC 143 Java Linked Lists Reading: Ch. 20.
Winter 2006CISC121 - Prof. McLeod1 Stuff Deadline for assn 3 extended to Monday, the 13 th. Please note that the testing class for assn 3 has changed.
CS 367 Introduction to Data Structures Lecture 2 Audio for Lecture 1 is available Homework 1 due Friday, September 18.
Collections Mrs. C. Furman April 21, Collection Classes ArrayList and LinkedList implements List HashSet implements Set TreeSet implements SortedSet.
1 TCSS 342, Winter 2005 Lecture Notes Linked List Implementation Weiss Ch. 6, pp Weiss Ch. 17, pp
© 2006 Pearson Addison-Wesley. All rights reserved5 B-1 Chapter 5 (continued) Linked Lists.
Copyright © 0 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with Java From Control Structures through Data Structures by Tony.
1 Today’s Material List ADT –Definition List ADT Implementation: LinkedList.
CS 367 Introduction to Data Structures Lecture 5.
List Interface and Linked List Mrs. Furman March 25, 2010.
IMPLEMENTING ARRAYLIST COMP 103. RECAP  Comparator and Comparable  Brief look at Exceptions TODAY  Abstract Classes - but note that the details are.
Data Structures Doubly and Circular Lists Lecture 07: Linked Lists
©The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Chapter Chapter 18 List ADT Animated Version.
2015-T2 Lecture 19 School of Engineering and Computer Science, Victoria University of Wellington  Marcus Frean, Lindsay Groves, Peter Andreae, and John.
CSE 501N Fall ‘09 10: Introduction to Collections and Linked Lists 29 September 2009 Nick Leidenfrost.
1 The copy constructor in the BankAccounts class. Two alternatives here: /** copy constructor */ public BankAccounts(BankAccounts L){ theAccounts = L.theAccounts.clone();
Implementing ArrayList Part T2 Lecture 6 School of Engineering and Computer Science, Victoria University of Wellington  Thomas Kuehne, Marcus Frean,
1 CS162: Introduction to Computer Science II Abstract Data Types.
An Array-Based Implementation of the ADT List
Linked Lists Chapter 5 (continued)
Programming Abstractions
Implementing ArrayList Part 1
Top Ten Words that Almost Rhyme with “Peas”
Prof. Neary Adapted from slides by Dr. Katherine Gibson
Programming in Java Lecture 11: ArrayList
CSE 143 Lecture 27: Advanced List Implementation
Lecture 26: Advanced List Implementation
Programming Abstractions
Programming II (CS300) Chapter 07: Linked Lists and Iterators
slides adapted from Marty Stepp and Hélène Martin
ArrayLists 22-Feb-19.
Collections Framework
List Implementation via Arrays
Linked Lists Chapter 5 (continued)
CSC 143 Java Linked Lists.
slides created by Marty Stepp
Programming II (CS300) Chapter 07: Linked Lists
slides adapted from Marty Stepp
TCSS 143, Autumn 2004 Lecture Notes
slides created by Marty Stepp
CSE 143 Lecture 21 Advanced List Implementation
Linked Lists Chapter 5 (continued)
slides created by Marty Stepp
slides created by Marty Stepp
slides created by Marty Stepp and Hélène Martin
Presentation transcript:

(c) University of Washington16-1 CSC 143 Java Lists via Links Reading: Ch. 23

(c) University of Washington16-2 Review: List Implementations The external interface is already defined Implementation goal: implement methods “efficiently” ArrayList approach: use an array with extra space internally ArrayList efficiency Iterating, indexing (get & set) is fast Typically a one-liner Adding at end is fast, except when we have to grow Adding or removing in the middle is slow: requires sliding all later elements

(c) University of Washington16-3 A Different Strategy: Lists via Links Instead of packing all elements together in an array, create a linked chain of all the elements

(c) University of Washington16-4 Links For each element in the list, create a Link object Each Link points to the data item (element) at that position, and also points to the next Link in the chain Link item next

(c) University of Washington16-5 Linked Links Each Link points to the next No limit on how many can be linked! A null reference signals the end Link item next Link item next Link item next null

(c) University of Washington16-6 Linked List The List has a reference to the first Link Altogether, the list involves 3 different object types Link item next Link item next Link item next null List first

(c) University of Washington16-7 Link Class: Data /** Link for a simple list */ public class Link { public Object item ;// data associated with this link public Link next ;// next Link, or null if no next link //no more instance variables //but maybe some methods } //end Link Note 1: This class does NOT represent the chain, only one link of a chain Note 2: “public” violates normal practice – will discuss other ways later Note 3: The links are NOT part of the data. The data is totally unaware that it is part of a chain. Link item next

(c) University of Washington16-8 Link Constructor /** Link for a simple list */ public class Link { public Object item ;// data associated with this link public Link next ;// next Link, or null if none /** Construct new link with given data item and next link (or null if none) */ public Link (Object item, Link next) { this.item = item; this.next = next; } … } Link item next

(c) University of Washington16-9 LinkedList Data /** Simple version of LinkedList for CSE143 lecture example */ public class SimpleLinkedList implements List { // instance variables private Link first ;// first link in the list, or null if list is empty … } List first

(c) University of Washington16-10 LinkedList Data & Constructor /** Simple version of LinkedList for CSE143 lecture example */ public class SimpleLinkedList implements List { // instance variables private Link first ;// first link in the list, or null if list is empty … // construct new empty list public SimpleLinkedList ( ) { this.first = null;// no links yet! } … List first

(c) University of Washington16-11 List Interface (review) Operations to implement: int size( ) boolean isEmpty( ) boolean add(Object o) boolean addAll(Collection other) void clear( ) Object get(int pos) boolean set(int pos, Object o) int indexOf(Object o) boolean contains(Object o) Object remove(int pos) boolean remove(Object o) boolean add(int pos, Object o) Iterator iterator( ) What don't we see anywhere here??

(c) University of Washington16-12 Method add (First Try) public boolean add (Object o) { // create new link and place at end of list: Link newLink = new Link(o, null); // find last link in existing chain: it's the one whose next link is null: Link p = this.first; while (p.next != null) { p = p.next; } // found last link; now add the new link after it: p.next = newLink; return true; // we changed the list => return true }

(c) University of Washington16-13 Draw the Official CSE143 Picture Client code: LinkedList vertexes = new SimpleLinkedList(); Point2D p1 = new Point2D.Double(100.0, 50.0); Point2D p2 = new Point2D.Double( 250, 310); Point2D p3 = new Point2D.Double(90, 350.0); vextexes.add(p1); vertexes.add(p2); vertexes.add(p3); vertexes.add(p1);

(c) University of Washington16-14 Problems with naïve add method Inefficient: requires traversal of entire list to get to the end One loop iteration per link Gets slower as list gets longer Solution?? Buggy: fails when adding first link to an empty list Check the code: where does it fail? Solution??

(c) University of Washington16-15 Improvements to naïve add method Inefficient: requires traversal of entire list to get to the end A solution: Remove the constraint that instance variables are fixed. Change LinkedList to keep a pointer to last link as well as the first Buggy: fails when adding first link to an empty list A solution: check for this case and execute special code Q: “Couldn’t we....?” Answer: “probably”. There are many ways link lists could be implemented

(c) University of Washington16-16 List Data & Constructor (revised) public class SimpleLinkedList implements List { // instance variables private Link first ;// first link in the list, or null if list is empty private Link last ;// last link in the list, or null if list is empty … // construct new empty list public SimpleLinkedList ( ) { this.first = null;// no links yet! this.last = null;// no links yet! } …

(c) University of Washington16-17 Link List with last last List first Link item next Link item next Link item next null last

(c) University of Washington16-18 Method add (Final Version) public boolean add (Object o) { // create new link to place at end of list: Link newLink = new Link(o, null); // check if adding the first link if (this.first == null) { // we're adding the first link this.first = newLink; } else { // we have some existing links; add the new link after the old last link this.last.next = newLink; } // update the last link this.last = newLink; return true; // we changed the list => return true } last

(c) University of Washington16-19 Method size( ) First try it with this restriction: you can’t add or redefine instance variables Hint: count the number of links in the chain /** Return size of this list */ public int size ( ) { int count = 0; return count; }

(c) University of Washington16-20 Method size( ) Solution: count the number of links in the list /** Return size of this list */ public int size ( ) { int count = 0; Iterator iter = this.iterator( ); while (iter.hasNext( )) { count ++; iter.next( );// ignore the link itself! } return count; } Critique?

(c) University of Washington16-21 Method size (revised) Add an instance variable to the list class int numLinks; // number of links in this list Add to constructor: Add to method add: Method size (new version) /** Return size of this list */ public int size ( ) { } Critique? List first last numLinks

(c) University of Washington16-22 Method size (revised) Add an instance variable to the list class int numLinks;// number of links in this list Add to constructor: this.numLinks = 0; Add to method add : this.numLinks ++; Method size /** Return size of this list */ public int size( ) { return this.numLinks; } Critique? List first last numLinks n

(c) University of Washington16-23 clear Simpler than with arrays or not? /** Clear this list */ public void clear ( ) { this.first = null; this.last = null; this.numLinks = 0; } No need to "null out" the elements themselves Garbage Collector will reclaim the Link objects automatically But – garbage collection would work better with explicit nulling out

(c) University of Washington16-24 get /** Return object at position pos of this list. 0 <= pos < size, else IndexOOBExn */ public Object get (int pos) { if (pos = this.numLinks) { throw new IndexOutOfBoundsException( ); } // search for pos'th link Link p = this.first; for (int k = 0; k < pos; k++) { p = p.next; } // found it; now return the element in this link return p.item; } Critique? DO try this at home. Try “set” too

(c) University of Washington16-25 add and remove at given position Observation: to add a link at position k, we need to change the next pointer of the link at position k-1 Observation: to remove a link at position k, we need to change the next pointer of the link at position k-1

(c) University of Washington16-26 Helper for add and remove Possible helper method: get link given its position // Return the link at position pos // precondition (unchecked): 0 <= pos < size private Link getLinkAtPos (int pos) { Link p = this.first; for (int k = 0; k < pos; k++) { p = p.next; } return p; } Use this in get, too How is this different from the get(pos) method of the List?

(c) University of Washington16-27 remove(pos) : Study at Home! /** Remove the object at position pos from this list. 0 <= pos < size, else IndexOOBExn */ public Object remove (int pos) { if (pos = this.numLinks) { throw new IndexOutOfBoundsException( ); } Object removedElem; if (pos == 0) { removedElem = this.first.item;// remember removed item, to return it this.first = this.first.next;// remove first link if (this.first == null) { this.last = null; }// update last, if needed } else { Link prev = getLinkAtPos(pos-1);// find link before one to remove removedElem = prev.next.item;// remember removed item, to return it prev.next = prev.next.next;// splice out link to remove if (prev.next == null) { this.last = prev; }// update last, if needed } this.numLinks --;// remember to decrement the size! return removedElem; }

(c) University of Washington16-28 add(pos) : Study at Home! /** Add object o at position pos in this list. 0 <= pos <= size, else IndexOOBExn */ public boolean add (int pos, Object o) { if (pos = this.numLinks) { throw new IndexOutOfBoundsException( ); } if (pos == 0) { this.first = new Link(o, this.first); // insert new link at the front of the chain if (this.last == null) { this.last = this.first; } // update last, if needed } else { Link prev = getLinkAtPos(pos-1); // find link before one to insert prev.next = new Link(o, prev.next); // splice in new link between prev & prev.next if (this.last == prev) { this.last = prev.next; } // update last, if needed } this.numLinks ++;// remember to increment the size! return true; }

(c) University of Washington16-29 Implementing iterator( ) To implement an iterator, could do the same thing as with SimpleArrayLists: return an instance of SimpleListIterator Recall: SimpleListIterator tracks the List and the position (index) of the next item to return How efficient is this for LinkedLists? Can we do better?

(c) University of Washington16-30 Summary SimpleLinkedList presents same illusion to its clients as SimpleArrayList Key implementation ideas: a chain of links Different efficiency trade-offs than SimpleArrayList must search to find positions, but can easily insert & remove without growing or sliding get, set a lot slower add, remove faster (particularly at the front): no sliding required

(c) University of Washington16-31 Links and Lists List first Link item next Link item next List first List first last List first last numLinks

(c) University of Washington16-32 List first Link item next Link item next Link item next null last