Newer
Older
Assignment2B / src / List.java
public class List<T> implements IList<T> {

	/**
	 * Node for handling the list.
	 */
	private class Node {
		private T item;
		private Node next;

		public Node(T item, Node next) {
			this.item = item;
			this.next = next;
		}

		public Node(T item) {
			this.item = item;
			this.next = null;
		}
	}

	/**
	 * Contains the root node.
	 */
	private Node root;

	/**
	 * Add an element of any position. Negative means adding it to the end.
	 */
	@Override
	public void addAt(int pos, T elem) {
		if (root == null) {
			root = new Node(elem);
		} else if (pos == 0) {
			root = new Node(elem, root);
		} else {
			Node walker = root;
			Node prev = null;

			// If position is -1, then loop until the end of the list.
			if (pos == -1) {
				while (walker != null) {
					prev = walker;
					walker = walker.next;
				}
			// If pos is above 0, loop until it's done.
			} else if (pos > 0) {
				while (walker != null && (pos > 0)) {
					pos--;
					prev = walker;
					walker = walker.next;
				}
			}

			walker = new Node(elem, walker);
			prev.next = walker;
		}
	}

	/**
	 * Remove an element at a position.
	 */
	@Override
	public boolean removeAt(int pos) {
		boolean isRemoved = false;
		if (root != null) {
			if (pos == 0) {
				root = root.next;
				isRemoved = true;
			} else if (pos > 0 && pos < size()) {
				Node walker = root;
				Node prev = null;

				while (walker != null && pos > 0) {
					pos--;
					prev = walker;
					walker = walker.next;
				}

				prev.next = walker.next;
				walker = null;
				isRemoved = true;
			}
		}
		return isRemoved;
	}

	/**
	 * Find an item in the list of type T.
	 */
	@Override
	public int find(T elem) {
		int returnValue = 0;

		Node walker = root;
		while (walker != null && walker.item != elem) {
			walker = walker.next;
			returnValue++;
		}

		if (walker == null) {
			returnValue = -1;
		}

		return returnValue;
	}

	/**
	 * Return the current size of the list.
	 */
	@Override
	public int size() {
		int returnValue = 0;
		Node walker = root;
		while (walker != null) {
			walker = walker.next;
			returnValue++;
		}
		return returnValue;
	}

	/**
	 * Remove all elements.
	 */
	@Override
	public void clear() {
		while (root != null) {
			Node temp = root.next;
			root = null;
			root = temp;
		}
	}

	/**
	 * Append an IList<T> to this list.
	 */
	@Override
	public void append(IList<T> aList) {
		@SuppressWarnings("unchecked")
		T[] elements = (T[]) aList.getAllElementsAsStrings();
		int size = size();

		for (T element : elements) {
			addAt(size++, element);
		}
	}

	/**
	 * Returns an array of strings with all elements.
	 */
	@Override
	public String[] getAllElementsAsStrings() {
		int size = size();
		String[] list = new String[size];

		Node walker = root;
		for (int i = 0; i < size; ++i) {
			list[i] = (String) walker.item;
			walker = walker.next;
		}

		return list;
	}
}