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;
}
}
}