public static void Main()
var a = new ListNode<string>("a", new ListNode<string>("b", new ListNode<string>("c", null)));
var e = new ListNode<string>("e", new ListNode<string>("f", new ListNode<string>("g", null)));
var resultForCombine = ListNode<string>.CombineListNode(a, e);
var res = resultForCombine;
Console.WriteLine("Test combine");
Console.WriteLine(res.Value);
if (res.Next == null) break;
var o = new ListNode<string>("o", null);
var resForReplace = ListNode<string>.ReplaceListNode(resultForCombine, e, o);
Console.WriteLine("Test replace");
Console.WriteLine(res.Value);
if (res.Next == null) break;
public readonly ListNode<T> Next;
public ListNode(T value, ListNode<T> next)
public static ListNode<T> ReplaceListNode(ListNode<T> source, ListNode<T> search, ListNode<T> replace)
if(source == null) return null;
if(source.Equals(search))
return CombineListNode(replace, source.Next);
return new ListNode<T>(source.Value, ReplaceListNode(source.Next, search, replace));
public static ListNode<T> CombineListNode(ListNode<T> first, ListNode<T> second)
return new ListNode<T>(first.Value, second);
return new ListNode<T>(first.Value, CombineListNode(first.Next, second));