/// <summary>
        /// you can inter a data and get a set with a header and the node that has that data
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static DisjointSetLInkedLIstFormNode <T> Make(T data)
        {
            DisjointSetLInkedLIstFormNode <T> node   = new DisjointSetLInkedLIstFormNode <T>();
            ListHeaderLinkedList <T>          header = new ListHeaderLinkedList <T>();

            node.Data             = data;
            node.Next             = null;
            node.HeaderLinkedList = header;
            header.Head           = node;
            header.Tail           = node;
            header.nodes.AddFirst(node);
            return(node);
        }
        private static void Join2Part(DisjointSetLInkedLIstFormNode <T> node1, DisjointSetLInkedLIstFormNode <T> node2)
        {
            ListHeaderLinkedList <T> node1Header = node1.HeaderLinkedList;
            ListHeaderLinkedList <T> node2Header = node2.HeaderLinkedList;

            for (int i = 0; i < node1Header.nodes.Count; i++)
            {
                DisjointSetLInkedLIstFormNode <T> temp = node1Header.nodes.First();
                node1Header.nodes.RemoveFirst();
                node2Header.Tail.Next = temp;
                node2Header.Tail      = temp;
                temp.Next             = null;
                temp.HeaderLinkedList = node2Header;
            }
        }