using System.Collections.Generic;
public static void Main()
Console.WriteLine("-------------");
ListNodeReverseRecursiveTest();
ListNodeReverseDirectTest();
public static void SortTest()
Console.WriteLine("Sorting");
var range = new[] {1, 342, 3523, 123, 646, -564};
Array.ForEach(range, x => Console.Write(x + ", "));
Console.WriteLine("\nSorted:");
range.QuickSort(x => x).ToList().ForEach(x => Console.Write(x + ", "));
Console.WriteLine("\n-------------");
public static void AnagramTest()
Console.WriteLine("Searching anagrams");
var str1 = new[] { "abc", "bac", "cab", "wsr", "rsw", "bca", "bvc", "cvb", "no"};
var t = str1.FindAnagrams();
Array.ForEach(str1, x => Console.Write(x + ", "));
Console.WriteLine("\nAnagrams:");
Console.WriteLine("-------------");
public static void ListNodeReverseRecursiveTest()
Console.WriteLine("Recursive reversing");
var range = Enumerable.Range(0, 10).ToList();
var directNode = new ImmutableLinkedListNode<int>(range);
PrintListNode(directNode);
PrintListNode(directNode.ReverseRecursive());
Console.WriteLine("-------------");
public static void ListNodeReverseDirectTest()
Console.WriteLine("Non-recursive reversing");
var range = Enumerable.Range(0, 10).ToList();
var directNode = new ImmutableLinkedListNode<int>(range);
PrintListNode(directNode);
PrintListNode(directNode.ReverseDirect());
Console.WriteLine("-------------");
private static void PrintListNode(ImmutableLinkedListNode<int> head)
Console.Write(head.Value + ", ");
public class ImmutableLinkedListNode<T>
public ImmutableLinkedListNode(T value, ImmutableLinkedListNode<T> next)
public ImmutableLinkedListNode(IReadOnlyList<T> source)
var prev = new ImmutableLinkedListNode<T>(source.Last(), null);
for (var i = source.Count - 1; i > 0; i--)
prev = new ImmutableLinkedListNode<T>(source[i - 1], prev);
public T Value { get; private set; }
public ImmutableLinkedListNode<T> Next { get; private set; }
public ImmutableLinkedListNode<T> ReverseRecursive()
return ReverseImpl(this, null);
private static ImmutableLinkedListNode<T> ReverseImpl(
ImmutableLinkedListNode<T> current,
ImmutableLinkedListNode<T> prev)
var revNode = new ImmutableLinkedListNode<T>(current.Value, prev);
return current.Next == null ? revNode : ReverseImpl(current.Next, revNode);
public ImmutableLinkedListNode<T> ReverseDirect()
var revNode = new ImmutableLinkedListNode<T>(Value, null);
for (var i = Next; i != null; i = i.Next)
revNode = new ImmutableLinkedListNode<T>(i.Value, revNode);
public static class Sorter
public static IEnumerable<T> QuickSort<T, TKey>(this IEnumerable<T> source, Func<T, TKey> selector)
return QuickSort(source, selector, Comparer<TKey>.Default);
public static IEnumerable<T> QuickSort<T, TKey>(IEnumerable<T> source, Func<T, TKey> selector, IComparer<TKey> comparer)
var values = source.ToList();
var firstElement = selector(values.First());
var rest = values.Skip(1).ToList();
var smallerElements = rest
.Where(x => comparer.Compare(selector(x), firstElement) < 0)
var largerElements = rest
.Where(x => comparer.Compare(selector(x), firstElement) >= 0)
.Concat(new List<T> {values.First()})
public static class Anagram
public static IReadOnlyList<IReadOnlyList<string>> FindAnagrams(this IReadOnlyList<string> source)
.SelectMany(g => g.GroupBy(s => s.OrderBy(c => c), CharSequenceComparer.Instance)
.Where(g1 => g1.ElementAtOrDefault(1) != null)
.Select(g1 => g1.ToList()))
private class CharSequenceComparer : IEqualityComparer<IEnumerable<char>>
public static readonly CharSequenceComparer Instance = new CharSequenceComparer();
private CharSequenceComparer()
public bool Equals(IEnumerable<char> x, IEnumerable<char> y)
return x.SequenceEqual(y);
public int GetHashCode(IEnumerable<char> obj)