Chapter 6 Lists.

Slides:



Advertisements
Similar presentations
Topic 12 The List ADT. 9-2 Objectives Examine list processing and various ordering techniques Define a list abstract data type Examine various list implementations.
Advertisements

Lists and the Collection Interface Chapter 4. Chapter Objectives To become familiar with the List interface To understand how to write an array-based.
Chapter 15 Lists. Chapter Scope Types of list collections Using lists to solve problems Various list implementations Comparing list implementations Java.
1 Lists A List ADT Types of Lists Lists in Java Collections API Using ordered lists – Tournament Maker Using indexed lists – Josephus Problem Implementing.
Chapter 7 Queues. Copyright © 2004 Pearson Addison-Wesley. All rights reserved.1-2 Chapter Objectives Examine queue processing Define a queue abstract.
Chapter 5 Queues Modified. Chapter Scope Queue processing Comparing queue implementations 5 - 2Java Software Structures, 4th Edition, Lewis/Chase.
Chapter 14 Queues. Chapter Scope Queue processing Using queues to solve problems Various queue implementations Comparing queue implementations Java Foundations,
Chapter 7 Iterators Modified. Chapter Scope The purpose of an iterator The Iterator and Interable interfaces The concept of fail-fast collections Using.
1 Lists A List ADT Types of Lists Lists in Java Collections API Using ordered lists – Tournament Maker Using indexed lists – Josephus Problem Implementing.
Chapter 15 Lists.
CHAPTER 8 Lists. 2 A list is a linear collection Adding and removing elements in lists are not restricted by the collection structure We will examine.
Lists and the Collection Interface Chapter 4. Chapter 4: Lists and the Collection Interface2 Chapter Objectives To become familiar with the List interface.
Fall 2007CS 2251 Lists and the Collection Interface Chapter 4.
CHAPTER 6 Stacks Array Implementation. 2 Stacks A stack is a linear collection whose elements are added and removed from one end The last element to be.
Chapter 8 Lists. Copyright © 2005 Pearson Addison-Wesley. All rights reserved. 8-2 Chapter Objectives Examine list processing and various ordering techniques.
Chapter 13 Linked Structures - Stacks. Chapter Scope Object references as links Linked vs. array-based structures Managing linked lists Linked implementation.
Chapter 14 Queues. First a Review Queue processing Using queues to solve problems – Optimizing customer service simulation – Ceasar ciphers – Palindrome.
Chapter 4 Linked Structures – Stacks Modified. Chapter Scope Object references as links Linked vs. array-based structures Managing linked lists Linked.
Chapter 12 Introduction to Collections - Stacks
Topic 3 The Stack ADT.
Chapter 3 Introduction to Collections – Stacks Modified
Lists Based on content from: Java Foundations, 3rd Edition.
Chapter 8 Lists. Copyright © 2004 Pearson Addison-Wesley. All rights reserved.1-2 Chapter Objectives Examine list processing and various ordering techniques.
COS 312 DAY 21 Tony Gauvin. Ch 1 -2 Agenda Questions? Last Capstone Progress reports due April 23 Assignment 6 Due Assignment 7 Posted – Chapters 15,
© 2010 Pearson Addison-Wesley. All rights reserved. Addison Wesley is an imprint of CHAPTER 10: Binary Search Trees Java Software Structures: Designing.
Chapter 10-A Trees Modified
COS 312 DAY 20 Tony Gauvin. Ch 1 -2 Agenda Questions? Capstone Progress reports over due Assignment 6 Posted – Due April 16 – Questions? Queues.
Chapter 20 Binary Search Trees
© 2010 Pearson Addison-Wesley. All rights reserved. Addison Wesley is an imprint of CHAPTER 5: Queues Java Software Structures: Designing and Using Data.
Linked Structures - Review Chapter 13 Instructor: Scott Kristjanson CMPT 125/125 SFU Burnaby, Fall 2013.
Chapter 2 Collections. Copyright © 2004 Pearson Addison-Wesley. All rights reserved.1-2 Chapter Objectives Define the concept and terminology related.
Chapter 3 Collections. Objectives  Define the concepts and terminology related to collections  Explore the basic structures of the Java Collections.
Chapter 6 Lists Modified. Chapter Scope Types of lists Using lists to solve problems Various list implementations Comparing list implementations 6 - 2Java.
1 Stacks (Continued) and Queues Array Stack Implementation Linked Stack Implementation The java.util.Stack class Queue Abstract Data Type (ADT) Queue ADT.
Introduction to Collections. Collections Collections provide a way of organizing related data in a model Different types of collections have different.
© 2010 Pearson Addison-Wesley. All rights reserved. Addison Wesley is an imprint of CHAPTER 15: Sets and Maps Java Software Structures: Designing and Using.
1 Queues (Continued) Queue ADT Linked queue implementation Array queue implementation Circular array queue implementation Deque Reading L&C , 9.3.
COS 312 DAY 23 Tony Gauvin. Ch 1 -2 Agenda Questions? Capstone progress report Overdue Assignment 6 Over Due Assignment 7 (bonus) – Due May 11 – Will.
Collections & Stacks Collections A collection is an object that holds and organizes other objects It provides operations for accessing and managing.
1 Binary Search Trees What are the disadvantages of using a linked list? What are the disadvantages of using an array- based list? Binary search trees.
Iterators. Chapter Scope The purpose of an iterator The Iterator and Interable interfaces The concept of fail-fast collections Using iterators to solve.
Lists and the Collection Interface Chapter 4. Chapter 4: Lists and the Collection Interface2 Chapter Objectives To become familiar with the List interface.
1 Iterators & the Collection Classes. 2 » The Collection Framework classes provided in the JAVA API(Application Programmer Interface) contains many type.
Linked Structures - Stacks. Linked Structures An alternative to array-based implementations are linked structures A linked structure uses object references.
CSCI 62 Data Structures Dr. Joshua Stough September 23, 2008.
The Queue ADT.
CHAPTER 4: Linked Structures
The List ADT.
Lists A List ADT Types of Lists Using ordered lists – Tournament Maker
Marcus Biel, Software Craftsman
COS 312 DAY 21 Tony Gauvin.
The Stack ADT. 3-2 Objectives Define a stack collection Use a stack to solve a problem Examine an array implementation of a stack.
Chapter 16 Iterators.
Chapter 3 Introduction to Collections - Stacks
Top Ten Words that Almost Rhyme with “Peas”
Chapter 4 Linked Structures - Stacks
Chapter 5 Queues.
Chapter 7 Iterators.
Java Software Structures: John Lewis & Joseph Chase
Chapter 4 Linked Structures - Stacks
Java Software Structures: John Lewis & Joseph Chase
Programming II (CS300) Chapter 07: Linked Lists and Iterators
Object Oriented Programming in java
Example: LinkedSet<T>
CSE 331 Memento Pattern slides created by Marty Stepp based on materials by M. Ernst, S. Reges, D. Notkin, R. Mercer, Wikipedia
CHAPTER 11: Priority Queues and Heaps
Programming II (CS300) Chapter 07: Linked Lists
Chapter 20 Binary Search Trees
Chapter 21 Heaps and Priority Queues
CHAPTER 3: Collections—Stacks
Presentation transcript:

Chapter 6 Lists

Chapter Scope Types of list collections Using lists to solve problems Various list implementations Comparing list implementations Java Software Structures, 4th Edition, Lewis/Chase

Lists A list is a linear collection, like stacks and queues, but is more flexible Adding and removing elements in lists can occur at either end or anywhere in the middle We will examine three types of list collections: ordered lists unordered lists indexed lists Java Software Structures, 4th Edition, Lewis/Chase

Ordered Lists The elements in an ordered list are ordered by some inherent characteristic of the elements Names in alphabetical order Scores in ascending order The elements themselves determine where they are stored in the list Java Software Structures, 4th Edition, Lewis/Chase

Ordered Lists An ordered list: Java Software Structures, 4th Edition, Lewis/Chase

Unordered Lists There is still an order to the elements in an unordered list, but that order is not based on element characteristics The user of the list determines the order of the elements A new element can be put on the front or the rear of the list, or it can be inserted after a particular element already in the list Java Software Structures, 4th Edition, Lewis/Chase

Unordered Lists An unordered list: Java Software Structures, 4th Edition, Lewis/Chase

Indexed Lists In an indexed list, elements are referenced by their numeric position in the list Like an unordered list, there is no inherent relationship among the elements The user can determine the order Every time the list changes, the indices are updated Java Software Structures, 4th Edition, Lewis/Chase

Indexed Lists An indexed list: Java Software Structures, 4th Edition, Lewis/Chase

Lists in the Java API The list classes in the Java API primarily support the concept of an indexed list (and somewhat an unordered list) The API does not have any classes that directly implement an ordered list The ArrayList and LinkedList classes both implement the List<E> interface Java Software Structures, 4th Edition, Lewis/Chase

Lists in the Java API Some of the operations from the List<E> interface: Java Software Structures, 4th Edition, Lewis/Chase

Program of Study Let's use an unordered list to manage the courses that a student takes to fulfill degree requirements The Course class represents a course, which may or may not have already been taken The ProgramOfStudy class manages a list of Course objects The list is stored for later use using serialization Java Software Structures, 4th Edition, Lewis/Chase

xxx Java Software Structures, 4th Edition, Lewis/Chase

import java. io. IOException; / import java.io.IOException; /** * Demonstrates the use of a list to manage a set of objects. * * @author Lewis and Chase * @version 4.0 */ public class POSTester { * Creates and populates a Program of Study. Then saves it using serialization. public static void main(String[] args) throws IOException ProgramOfStudy pos = new ProgramOfStudy(); pos.addCourse(new Course("CS", 101, "Introduction to Programming", "A-")); pos.addCourse(new Course("ARCH", 305, "Building Analysis", "A")); pos.addCourse(new Course("GER", 210, "Intermediate German")); pos.addCourse(new Course("CS", 320, "Computer Architecture")); pos.addCourse(new Course("THE", 201, "The Theatre Experience")); Course arch = pos.find("CS", 320); pos.addCourseAfter(arch, new Course("CS", 321, "Operating Systems")); // Add CS 321 after CS 320 (referenced by arch) Java Software Structures, 4th Edition, Lewis/Chase

Course theatre = pos. find("THE", 201); theatre Course theatre = pos.find("THE", 201); theatre.setGrade("A-"); Course german = pos.find("GER", 210); pos.replace(german, new Course("FRE", 110, "Beginning French", "B+")); // Replace FRE 110 with GER 210 (referenced by german) System.out.println(pos); pos.save("ProgramOfStudy"); } Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; /** * Represents a Program of Study, a list of courses taken and planned, for an * individual student. * * @author Lewis and Chase * @version 4.0 */ public class ProgramOfStudy implements Iterable<Course>, Serializable { private List<Course> list; // List: an interface * Constructs an initially empty Program of Study. public ProgramOfStudy() list = new LinkedList<Course>(); // LinkedList: a class that implements List } Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Adds the specified course to the end of the course list. * * @param course the course to add */ public void addCourse(Course course) { if (course != null) list.add(course); } * Finds and returns the course matching the specified prefix and number. * @param prefix the prefix of the target course * @param number the number of the target course * @return the course, or null if not found public Course find(String prefix, int number) for (Course course : list) // for each course in list // Course: an ADT, course: a reference variable of type Course if (prefix.equals(course.getPrefix()) && number == course.getNumber()) return course; return null; Java Software Structures, 4th Edition, Lewis/Chase

/. Adds the specified course after the target course. Does nothing if /** * Adds the specified course after the target course. Does nothing if * either course is null or if the target is not found. * * @param target the course after which the new course will be added * @param newCourse the course to add */ public void addCourseAfter(Course target, Course newCourse) { if (target == null || newCourse == null) return; int targetIndex = list.indexOf(target); if (targetIndex != -1) list.add(targetIndex + 1, newCourse); } Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Replaces the specified target course with the new course. Does nothing if * either course is null or if the target is not found. * * @param target the course to be replaced * @param newCourse the new course to add */ public void replace(Course target, Course newCourse) { if (target == null || newCourse == null) return; int targetIndex = list.indexOf(target); if (targetIndex != -1) list.set(targetIndex, newCourse); } * Creates and returns a string representation of this Program of Study. * @return a string representation of the Program of Study public String toString() String result = ""; for (Course course : list) result += course + "\n"; return result; Java Software Structures, 4th Edition, Lewis/Chase

/. Returns an iterator for this Program of Study /** * Returns an iterator for this Program of Study. * * @return an iterator for the Program of Study */ public Iterator<Course> iterator() { return list.iterator(); } * Saves a serialized version of this Program of Study to the specified * file name. * @param fileName the file name under which the POS will be stored * @throws IOException public void save(String fileName) throws IOException FileOutputStream fos = new FileOutputStream(fileName); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(this); oos.flush(); oos.close(); Java Software Structures, 4th Edition, Lewis/Chase

/. Loads a serialized Program of Study from the specified file /** * Loads a serialized Program of Study from the specified file. * * @param fileName the file from which the POS is read * @return the loaded Program of Study * @throws IOException * @throws ClassNotFoundException */ public static ProgramOfStudy load(String fileName) throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fis); ProgramOfStudy pos = (ProgramOfStudy) ois.readObject(); ois.close(); return pos; } Java Software Structures, 4th Edition, Lewis/Chase

import java. io. Serializable; / import java.io.Serializable; /** * Represents a course that might be taken by a student. * * @author Lewis and Chase * @version 4.0 */ public class Course implements Serializable { private String prefix; private int number; private String title; private String grade; Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Constructs the course with the specified information. * * @param prefix the prefix of the course designation * @param number the number of the course designation * @param title the title of the course * @param grade the grade received for the course */ public Course(String prefix, int number, String title, String grade) { this.prefix = prefix; this.number = number; this.title = title; if (grade == null) this.grade = ""; else this.grade = grade; } * Constructs the course with the specified information, with no grade * established. public Course(String prefix, int number, String title) this(prefix, number, title, ""); Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Returns the prefix of the course designation. * * @return the prefix of the course designation */ public String getPrefix() { return prefix; } * Returns the number of the course designation. * @return the number of the course designation public int getNumber() return number; * Returns the title of this course. * @return the prefix of the course public String getTitle() return title; Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Returns the grade for this course. * * @return the grade for this course */ public String getGrade() { return grade; } * Sets the grade for this course to the one specified. * @param grade the new grade for the course public void setGrade(String grade) this.grade = grade; * Returns true if this course has been taken (if a grade has been received). * @return true if this course has been taken and false otherwise public boolean taken() return !grade.equals(""); // If the course has been taken, the grade is not an empty string. // Then, this method will return true. Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Determines if this course is equal to the one specified, based on the * course designation (prefix and number). * * @return true if this course is equal to the parameter */ public boolean equals(Object other) { boolean result = false; if (other instanceof Course) Course otherCourse = (Course) other; if (prefix.equals(otherCourse.getPrefix()) && number == otherCourse.getNumber()) result = true; } return result; * Creates and returns a string representation of this course. * @return a string representation of the course public String toString() String result = prefix + " " + number + ": " + title; if (!grade.equals("")) result += " [" + grade + "]"; Java Software Structures, 4th Edition, Lewis/Chase

Serialization Serialization: the conversion of an object to a series of bytes The byte stream can then be de-serialized - converted into a replica of the original object. Any class whose objects will be saved to persistent storage or streamed across a communication link are tagged with the Serializable interface. Java Software Structures, 4th Edition, Lewis/Chase

xxx Java Software Structures, 4th Edition, Lewis/Chase

The Josephus Problem In a Josephus problem, a set of elements are arranged in a circle Starting with a particular element, every ith element is removed Processing continues until there is only one element left The question: given the starting point and remove count i, which element is left? Java Software Structures, 4th Edition, Lewis/Chase

The Josephus Problem 1 2 3 4 5 6 7 1 2 4 5 6 7 Example: Seven numbers from 1 to 7 arranged in a circle 1 2 3 4 5 6 7 Given a starting point, every third element from the remaining list will be removed. 1 2 3 4 5 6 7 1 2 4 5 6 7 1 2 4 5 7 1 4 5 7 1 4 5 1 4 4 Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase import java.util.*; /** * Demonstrates the use of an indexed list to solve the Josephus problem. * * @author Lewis and Chase * @version 4.0 */ public class Josephus { * Continue around the circle eliminating every nth soldier * until all of the soldiers have been eliminated. public static void main(String[] args) int numPeople, skip, targetIndex; List<String> list = new ArrayList<String>(); Scanner in = new Scanner(System.in); // get the initial number of soldiers System.out.print("Enter the number of soldiers: "); numPeople = in.nextInt(); in.nextLine(); // get the number of soldiers to skip System.out.print("Enter the number of soldiers to skip: "); skip = in.nextInt(); Java Software Structures, 4th Edition, Lewis/Chase

// load the initial list of soldiers for (int count = 1; count <= numPeople; count++) { list.add("Soldier " + count); } targetIndex = skip; System.out.println("The order is: "); // Treating the list as circular, remove every n-th element // until the list is empty while (!list.isEmpty()) System.out.println(list.remove(targetIndex)); // Note: list size is reduced by one after an element is removed from the list //  The list size keeps changing. //  The index of the elements after the removed element changes too if (list.size() > 0) targetIndex = (targetIndex + skip) % list.size(); Java Software Structures, 4th Edition, Lewis/Chase

The Josephus Problem Example: targetIndex = (targetIndex + skip) % list.size(); Example: Seven numbers from 1 to 7 arranged in a circle 1 2 3 4 5 6 7 Given a starting point, every third element (skip 2 elements) from the remaining list will be removed. Index 0 1 2 3 4 5 6 size targetIndex ele. removed 1 2 3 4 5 6 7 7 2 3 1 2 4 5 6 7 6 (2+2)%6 = 4 6 1 2 4 5 7 5 (4+2)%5 = 1 2 1 4 5 7 4 (1+2)%4 = 3 7 1 4 5 3 (3+ 2)%3 = 2 5 1 4 2 (2+2)%2 = 0 1 4 1 (0+2)%1 = 0 4 Java Software Structures, 4th Edition, Lewis/Chase

Implementing Lists Now let's implement our own list collection The following operations are common to all types of lists: ( ) ( ) (…) ( ) ( ) (…) ( ) ( ) See slide 36 Java Software Structures, 4th Edition, Lewis/Chase

Implementing Lists Operation particular to an ordered list: Operations particular to an unordered lists: (*) (*) (*) (*, *) See slide 36 Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase

package jsjf; import java. util. Iterator; / package jsjf; import java.util.Iterator; /** * ListADT defines the interface to a general list collection. Specific * types of lists will extend this interface to complete the * set of necessary operations. * * @author Lewis and Chase * @version 4.0 */ public interface ListADT<T> extends Iterable<T> { * Removes and returns the first element from this list. * @return the first element from this list public T removeFirst(); * Removes and returns the last element from this list. * @return the last element from this list public T removeLast(); ListADT: an interface Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Removes and returns the specified element from this list. * * @param element the element to be removed from the list */ public T remove(T element); * Returns a reference to the first element in this list. * @return a reference to the first element in this list public T first(); * Returns a reference to the last element in this list. * @return a reference to the last element in this list public T last(); * Returns true if this list contains the specified target element. * @param target the target that is being sought in the list * @return true if the list contains this element public boolean contains(T target); Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Returns true if this list contains no elements. * * @return true if this list contains no elements */ public boolean isEmpty(); * Returns the number of elements in this list. * @return the integer representation of number of elements in this list public int size(); * Returns an iterator for the elements in this list. * @return an iterator over the elements in this list public Iterator<T> iterator(); * Returns a string representation of this list. * @return a string representation of this list public String toString(); } Java Software Structures, 4th Edition, Lewis/Chase

package jsjf; /** * OrderedListADT defines the interface to an ordered list collection. Only * Comparable elements are stored, kept in the order determined by * the inherent relationship among the elements. * * @author Lewis and Chase * @version 4.0 */ public interface OrderedListADT<T> extends ListADT<T> { * Adds the specified element to this list at the proper location * @param element the element to be added to this list public void add(T element); } Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase package jsjf; /** * UnorderedListADT defines the interface to an unordered list collection. * Elements are stored in any order the user desires. * * @author Lewis and Chase * @version 4.0 */ public interface UnorderedListADT<T> extends ListADT<T> { * Adds the specified element to the front of this list. * @param element the element to be added to the front of this list public void addToFront(T element); Java Software Structures, 4th Edition, Lewis/Chase

/. Adds the specified element to the rear of this list /** * Adds the specified element to the rear of this list. * * @param element the element to be added to the rear of this list */ public void addToRear(T element); * Adds the specified element after the specified target. * @param element the element to be added after the target * @param target the target is the item that the element will be added * after public void addAfter(T element, T target); } Java Software Structures, 4th Edition, Lewis/Chase

Implementing a List with an Array Since elements can be added anywhere in the list, shifting elements cannot be avoided So a straightforward implementation can be adopted: Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase package jsjf; import jsjf.exceptions.*; import java.util.*; /** * ArrayList represents an array implementation of a list. The front of * the list is kept at array index 0. This class will be extended * to create a specific kind of list. * * @author Lewis and Chase * @version 4.0 */ public abstract class ArrayList<T> implements ListADT<T>, Iterable<T> { private final static int DEFAULT_CAPACITY = 100; private final static int NOT_FOUND = -1; protected int rear; protected T[] list; protected int modCount; * Creates an empty list using the default capacity. public ArrayList() this(DEFAULT_CAPACITY); } Java Software Structures, 4th Edition, Lewis/Chase

/. Creates an empty list using the specified capacity /** * Creates an empty list using the specified capacity. * * @param initialCapacity the integer value of the size of the array list */ public ArrayList(int initialCapacity) { rear = 0; list = (T[])(new Object[initialCapacity]); modCount = 0; } Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Removes and returns the specified element. * * @param element the element to be removed and returned from the list * @return the removed elememt * @throws ElementNotFoundException if the element is not in the list */ public T remove(T element) { T result; int index = find(element); if (index == NOT_FOUND) throw new ElementNotFoundException("ArrayList"); result = list[index]; rear--; // shift the appropriate elements for (int scan=index; scan < rear; scan++) list[scan] = list[scan+1]; list[rear] = null; modCount++; return result; } Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Returns true if this list contains the specified element. * * @param target the target element * @return true if the target is in the list, false otherwise */ public boolean contains(T target) { return (find(target) != NOT_FOUND); } * Returns the array index of the specified element, or the * constant NOT_FOUND if it is not found. * @return the index of the target element, or the * NOT_FOUND constant private int find(T target) int scan = 0; int result = NOT_FOUND; if (!isEmpty()) while (result == NOT_FOUND && scan < rear) if (target.equals(list[scan])) result = scan; else scan++; return result; Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Adds the specified Comparable element to this list, keeping * the elements in sorted order. * * @param element the element to be added to the list */ public void add(T element) { if (!(element instanceof Comparable)) throw new NonComparableElementException("OrderedList"); Comparable<T> comparableElement = (Comparable<T>)element; if (size() == list.length) expandCapacity(); int scan = 0; // find the insertion location while (scan < rear && comparableElement.compareTo(list[scan]) > 0) scan++; // shift existing elements up one first before insertion for (int shift=rear; shift > scan; shift--) list[shift] = list[shift-1]; // insert element list[scan] = element; rear++; modCount++; } Java Software Structures, 4th Edition, Lewis/Chase

Java Software Structures, 4th Edition, Lewis/Chase /** * Adds the specified element after the specified target element. * Throws an ElementNotFoundException if the target is not found. * * @param element the element to be added after the target element * @param target the target that the element is to be added after */ public void addAfter(T element, T target) { if (size() == list.length) expandCapacity(); int scan = 0; // find the insertion point while (scan < rear && !target.equals(list[scan])) scan++; if (scan == rear) // target is not found throw new ElementNotFoundException("UnorderedList"); // shift elements up one first before insertion for (int shift=rear; shift > scan; shift--) list[shift] = list[shift-1]; // insert element list[scan] = element; rear++; modCount++; } Java Software Structures, 4th Edition, Lewis/Chase

Implementing a List with Links A classic linked list is an obvious choice for implementing a list collection The LinearNode class introduced earlier is reused here Both head and tail references are maintained, as well as an integer count Java Software Structures, 4th Edition, Lewis/Chase

package jsjf; import jsjf. exceptions. ; import java. util. ; / package jsjf; import jsjf.exceptions.*; import java.util.*; /** * LinkedList represents a linked implementation of a list. * * @author Lewis and Chase * @version 4.0 */ public abstract class LinkedList<T> implements ListADT<T>, Iterable<T> { protected int count; protected LinearNode<T> head, tail; protected int modCount; * Creates an empty list. public LinkedList() count = 0; head = tail = null; modCount = 0; } Java Software Structures, 4th Edition, Lewis/Chase

C: current P: previous P C P C P C head tail null … /** * Removes the first instance of the specified element from this * list and returns a reference to it. Throws an EmptyCollectionException * if the list is empty. Throws a ElementNotFoundException if the * specified element is not found in the list. * * @param targetElement the element to be removed from the list * @return a reference to the removed element * @throws EmptyCollectionException if the list is empty * @throws ElementNotFoundException if the target element is not found */ public T remove(T targetElement) throws EmptyCollectionException, ElementNotFoundException { if (isEmpty()) throw new EmptyCollectionException("LinkedList"); boolean found = false; LinearNode<T> previous = null; LinearNode<T> current = head; while (current != null && !found) { if (targetElement.equals(current.getElement()))found = true; else previous = current; // set previous to current current = current.getNext(); // advance current to the next node } C: current P: previous P C P C P C head tail … null Java Software Structures, 4th Edition, Lewis/Chase

throw new ElementNotFoundException("LinkedList"); if (!found) throw new ElementNotFoundException("LinkedList"); // Note: if found, current points to the target node if (size() == 1) // only one element in the list, this is the target to be removed head = tail = null; // new head and tail after removal else if (current.equals(head)) // target is at the head head = current.getNext(); // new head, tail does change else if (current.equals(tail)) // target is at the tail { tail = previous; // new tail, head does not change tail.setNext(null); // must reset the next field of tail to null } else // target is in the middle previous.setNext(current.getNext()); // bypass the target node count--; modCount++; return current.getElement(); Java Software Structures, 4th Edition, Lewis/Chase