All pastes #395519 Raw Edit

Pokey

public text v1 · immutable
·published 2007-03-15 02:26 UTC
rendered paste body
using System;

namespace System.Collections.Generic
{
	public class LinkList<T>
	{
		private Node<T> _Head;

		public Node<T> Head { get { return _Head; } }

		public void Add( T value )
		{
			if ( _Head == null )
			{
				_Head = new Node<T>( value );
				return;
			}
			Node<T> current = _Head;

			while ( current.Next != null )
			{
				current = current.Next;
			}

			current.Next = new Node<T>( value );
		}

		public void Remove( T value )
		{
			Node<T> node = Lookup( value );

			if ( node != null )
				Remove( node );
		}

		public void Remove( Node<T> node )
		{
			if ( _Head == null )
				return;

			Node<T> current = _Head;

			while ( current != null )
			{
				if ( node.Data.GetHashCode() == current.Data.GetHashCode() )
				{
					Node<T> previous = Previous( node );
					Node<T> next = node.Next;

					if ( next != null )
					{
						if ( previous == null )
							_Head = next;
						else
							previous.Next = next;
					}
					else if ( previous != null )
						previous.Next = null;

					break;
				}

				current = current.Next;
			}
		}

		public Node<T> Previous( Node<T> node )
		{
			if ( _Head == null || _Head == node )
				return null;

			Node<T> previous = _Head;
			Node<T> current = _Head.Next;

			while ( current != null )
			{
				if ( current == node )
					return previous;

				previous = current;
				current = current.Next;
			}

			return null;
		}

		public Node<T> Lookup( T value )
		{
			if ( _Head == null )
				return null;

			Node<T> current = _Head;

			while ( current != null )
			{
				if ( current.Data.GetHashCode() == value.GetHashCode() )
					return current;

				current = current.Next;
			}

			return null;
		}

		public bool Contains( T value )
		{
			return true;
		}
	}

	public class Node<T>
	{
		private T _Data;
		private Node<T> _Next;

		public T Data { get { return _Data; } set { _Data = value; } }
		public Node<T> Next { get { return _Next; } set { _Next = value; } }

		public Node( T data )
		{
			_Data = data;
		}
	}
}