All pastes #248039 Raw Edit

Miscellany

public text v1 · immutable
#248039 ·published 2006-11-14 03:11 UTC
rendered paste body
// A linked list is a sequence of nodes with efficient
// element insertion and removal.
// This class contains a subset of the methods of the
// standard java.util.LinkedList class.

import java.util.*;
import java.lang.*;

public class LinkedList
{
   //nested class to represent a node
   private class Node
   {
          public Object data;
          public Node next;
   }

   //only instance variable that points to the first node.
   private Node first;

   // Constructs an empty linked list.
   public LinkedList()
   {
      first = null;
   }


   // Returns the first element in the linked list.
   public Object getFirst()
   {
      if (first == null)
       {
         NoSuchElementException ex
             = new NoSuchElementException();
         throw ex;
       }
      else
         return first.data;
   }

   // Removes the first element in the linked list.
   public Object removeFirst()
   {
      if (first == null)
       {
         NoSuchElementException ex = new NoSuchElementException();
         throw ex;
       }
      else
       {
         Object element = first.data;
         first = first.next;  //change the reference since it's removed.
         return element;
       }
   }

   // Adds an element to the front of the linked list.
   public void addFirst(Object element)
   {
      //create a new node
      Node newNode = new Node();
      newNode.data = element;
      newNode.next = first;
      //change the first reference to the new node.
      first = newNode;
   }

   // Returns an iterator for iterating through this list.
   public ListIterator listIterator()
   {
      return new LinkedListIterator();
   }


   //nested class to define its iterator
   private class LinkedListIterator implements ListIterator
   {
      private Node position; //current position
      private Node previous; //it is used for remove() method

      // Constructs an iterator that points to the front
      // of the linked list.

      public LinkedListIterator()
      {
         position = null;
         previous = null;
      }

     // Tests if there is an element after the iterator position.
     public boolean hasNext()
      {
         if (position == null) //not traversed yet
          {
             if (first != null)
                return true;
             else
                return false;
          }
         else
           {
              if (position.next != null)
                 return true;
              else
                 return false;
           }
      }

      // Moves the iterator past the next element, and returns
      // the traversed element's data.
      public Object next()
      {
         if (!hasNext())
          {
           NoSuchElementException ex = new NoSuchElementException();
           throw ex;
          }
         else
          {
            previous = position; // Remember for remove

            if (position == null)
               position = first;
            else
               position = position.next;

            return position.data;
          }
      }

      // Adds an element before the iterator position
      // and moves the iterator past the inserted element.
      public void add(Object element)
      {
         if (position == null) //never traversed yet
         {
            addFirst(element);
            position = first;
         }
         else
         {
            //making a new node to add
            Node newNode = new Node();
            newNode.data = element;
            newNode.next = position.next;
            //change the link to insert the new node
            position.next = newNode;
            //move the position forward to the new node
            position = newNode;
         }
         //this means that we cannot call remove() right after add()
         previous = position;
      }

      // Removes the last traversed element. This method may
      // only be called after a call to the next() method.
      public void remove()
      {
         if (previous == position)  //not after next() is called
          {
            IllegalStateException ex = new IllegalStateException();
            throw ex;
          }
         else
          {
           if (position == first)
            {
              removeFirst();
            }
           else
            {
              previous.next = position.next; //removing
            }
           //stepping back
           //this also means that remove() cannot be called twice in a row.
           position = previous;
      }
      }

      // Sets the last traversed element to a different value.
      public void set(Object element)
      {
         if (position == null)
          {
            NoSuchElementException ex = new NoSuchElementException();
            throw ex;
          }
         else
          position.data = element;
      }
		
	public String toString()
	{
		listIterator();
		String s1 = new String();
		while(hasNext() == true)
		{
			s1 += (String)position.data;
			position = position.next;
		}
		return s1;
	}
	
	public int size()
	{	
		int size = 0;
		listIterator();
		while(hasNext() == true)
		{
			size += 1;
			position = position.next;
		}
		return size;
	}
	
	public int searchElement(Object element)
	{
		int index = -1;
		int other = 0;
		listIterator();
		while(hasNext() == true)
		{
			if(element.equals(position.data))
				index = 0;
				other++;
		}
		if(index == 0)
		return other;
		else
		return index;
	}
	
	public void addElement(int index, Object element)
	{
		listIterator();
		for(int i = 0; i < index; i++)
		{
			position = position.next;
		}
		add(element);
	}
	
	public Object removeElement(int index)
	{
		Object element;
		listIterator();
		for(int i = 0; i < index; i++)
		position = position.next;
		
		element = position.data;
		remove();
		return element;	
	}
	
	public Object findSmallest()
	{
		listIterator();
		Object smallest;
		smallest = first.data;
		String small = new String();
		while(hasNext() == true)
		{
			small = (String)smallest;
			if(small.compareTo((String)position.data) < 0)
				smallest = position.data;
			position = position.next;
		}
		return smallest;
	}
	
	public void removeAllOccurrences(Object stringToBeRemoved)
	{
		listIterator();
		while(hasNext() == true)
		remove();
	}
	
  }
} //end of LinkedList class