A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int...

27
A Linked List Class Modified version of author's class

Transcript of A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int...

Page 1: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

A Linked List Class

Modified version of author's class

Page 2: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

The Linked List Node

class Node<AnyType> { public Node( AnyType d, Node<AnyType> p, Node<AnyType> n ) { data = d; prev = p; next = n; } public AnyType data; public Node<AnyType> prev; public Node<AnyType> next; }

Page 3: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public class MyLinkedList<AnyType> implements Iterable<AnyType>{

Fields

Methods

}

Page 4: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

Fields

private int theSize; public Node<AnyType> beginMarker; public Node<AnyType> endMarker;

Page 5: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

Constructor

public MyLinkedList( ) { clear( ); }

Page 6: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public void clear( ) { beginMarker = new Node<AnyType>( null, null, null ); endMarker = new Node<AnyType>( null, beginMarker, null ); beginMarker.next = endMarker; theSize = 0; }

Page 7: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public int size( ) { return theSize; } public boolean isEmpty( ) { return size( ) == 0; }

Page 8: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

private Node<AnyType> getNode( int idx, int lower, int upper ) { Node<AnyType> p; if( idx < lower || idx > upper ) throw new IndexOutOfBoundsException( "getNode index: " + idx + "; size: " + size( ) );

Page 9: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

if( idx < size( ) / 2 ) { p = beginMarker.next; for( int i = 0; i < idx; i++ ) p = p.next; } else { p = endMarker; for( int i = size( ); i > idx; i-- ) p = p.prev; }

Page 10: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

return p; }

Page 11: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

private Node<AnyType> getNode( int idx ) { return getNode( idx, 0, size( ) - 1 ); }

Page 12: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public AnyType get( int idx ) { return getNode( idx ).data; }

Page 13: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public AnyType set( int idx, AnyType newVal ) { Node<AnyType> p = getNode( idx ); AnyType oldVal = p.data; p.data = newVal; return oldVal; }

Page 14: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

private void addBefore( Node<AnyType> p, AnyType x ) { Node<AnyType> newNode = new Node<AnyType>( x, p.prev, p ); newNode.prev.next = newNode; p.prev = newNode; theSize++; }

Page 15: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public void add( int idx, AnyType x ) { addBefore( getNode( idx, 0, size( ) ), x ); }

Page 16: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public boolean add( AnyType x ) { add( size( ), x ); return true; }

Page 17: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public AnyType remove( Node<AnyType> p ) { p.next.prev = p.prev; p.prev.next = p.next; theSize--; return p.data; }

Page 18: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public AnyType remove( int idx ) { return remove( getNode( idx ) ); }

Page 19: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

Method that returns an iterator

public java.util.Iterator<AnyType> iterator( ) { return new LinkedListIterator<AnyType>(this); }

Page 20: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

class LinkedListIterator<AnyType> implements java.util.Iterator<AnyType> {

Fields Methods}

Page 21: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

Fields

private Node<AnyType> current; private boolean okToRemove; private MyLinkedList<AnyType> theList;

Page 22: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

Constructor

public LinkedListIterator(MyLinkedList<AnyType> lst) { theList = lst; current = theList.beginMarker.next; okToRemove = false; }

Page 23: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public boolean hasNext( ) { return current != theList.endMarker; }

Page 24: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public AnyType next( ) { if( !hasNext( ) ) throw new java.util.NoSuchElementException( ); AnyType nextItem = current.data; current = current.next; okToRemove = true; return nextItem; }

Page 25: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

public void remove( ) { if( !okToRemove ) throw new IllegalStateException( ); theList.remove( current.prev ); okToRemove = false; }

Page 26: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

Testing the class within main

MyLinkedList<Integer> lst = new MyLinkedList<Integer>( ); for( int i = 0; i < 10; i++ ) lst.add( i ); for( int i = 20; i < 30; i++ ) lst.add( 0, i ); lst.remove( 0 ); lst.remove( lst.size( ) - 1 );

Page 27: A Linked List Class - cs.uiowa.edukvaradar/sp2010/A_Linked_List_Class.pdf · Fields private int theSize; public Node beginMarker; public Node endMarker;

Testing Continued

java.util.Iterator<Integer> itr = lst.iterator( ); while( itr.hasNext( ) ) { itr.next( ); itr.remove( ); System.out.println( lst ); }